235. 二叉搜索树的最近公共祖先
因为是搜索树,所以p,q的公共祖先一定是p,q中间值。从上往下遍历寻找祖先,第一个处于p,q中间值的节点就是p,q的公共祖先。如果当前节点值大于p,q就往左递归,寻找p,q之间值的节点。相反如果小于p,q,就往右递归,寻找p,q之间值的节点。如果当前值恰好是p,q之间的值就前序遍历,第一次遇到p,q中间值就返回当前节点。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==NULL) return root;
if(root->val>p->val&&root->val>q->val)
{
TreeNode* right = lowestCommonAncestor(root->left, p,q);
if(right!=NULL) return right;
}
else if(root->val<p->val&&root->val<q->val)
{
TreeNode* left = lowestCommonAncestor(root->right, p, q);
if(left!=NULL) return left;
}
return root;
}
};
701.二叉搜索树中的插入操作
class Solution {
TreeNode* parent =NULL;
void traversal(TreeNode* root, int val)
{
if(root==NULL)
{
TreeNode* add = new TreeNode(val);
if(parent->val > val) parent->left = add;
else parent->right = add;
return;
}
parent = root;
if(root->val>val) traversal(root->left,val);
if(root->val<val) traversal(root->right, val);
return;
}
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(root==NULL) return new TreeNode(val);
traversal(root, val);
return root;
}
};
450.删除二叉搜索树中的节点
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(root==NULL) return root;
else if(root->val==key)
{
if(root->right==NULL) return root->left;
else{
TreeNode* tmp = root->right;
while(tmp->left!=NULL) tmp = tmp->left;
tmp->left= root->left ;
return root->right;
}
}
TreeNode* left = root->left;
TreeNode* right = root->right;
if(root->val>key) left = deleteNode(root->left, key);
else if(root->val < key) right = deleteNode(root->right, key);
root->left = left;
root->right = right;
return root;
}
};