二叉搜索树求最近公共祖先
题目理解
二叉搜索树是有序的,如果是左中右排的话,只要在有序数组中查找两数之间的根节点就可以了。不需要遍历整棵树,找到就可以。
代码块
class Solution {
public:
TreeNode* traversal(TreeNode* curr, TreeNode* p, TreeNode* q) {
if (curr == NULL)
return curr;
if (curr->val > p->val && curr->val > q->val) {
TreeNode* left = traversal(curr->left, p, q);
if (left != NULL)
return left;}
if (curr->val < p->val && curr->val < q->val) {
TreeNode* right = traversal(curr->right, p, q);
if (right != NULL)
return right;
}return curr;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == NULL)
return root;
return traversal(root, p, q);
}
};
二叉搜索树中的插入操作
题目理解
在已知的一个二叉搜索树中插入一个节点,使插入操作之后该树依然是二叉搜索树。
思路
代码
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if (root == NULL) {
TreeNode* node = new TreeNode(val);
return node;
}
if (root->val > val)
root->left = insertIntoBST(root->left, val);
if (root->val < val)
root->right = insertIntoBST(root->right, val);
return root;
}
};
二叉搜索树中的删除操作
代码
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(root==NULL) return root;
if(root->val==key){
if(root->left==NULL&&root->right==NULL) return NULL;
if(root->left!=NULL&&root->right==NULL) return root->left;
if(root->left==NULL&&root->right!=NULL) return root->right;
else{
TreeNode* curr=root->right;
while(curr->left!=NULL) {curr=curr->left;}
curr->left = root->left;
TreeNode*tmp=root;
root =root->right;
tmp->left=curr->left;
delete tmp;
return root;
}
}
if(root->val>key) root->left=deleteNode(root->left,key);
if(root->val<key) root->right=deleteNode(root->right,key);
return root;
}
};
浙公网安备 33010602011771号