DAY20 - 235. 二叉搜索树的最近公共祖先, 701.二叉搜索树中的插入操作, 450.删除二叉搜索树中的节点
235. 二叉搜索树的最近公共祖先
遇到BST就要利用它的性质。p q的公共祖先应该是 [p,q] 中间的。
BST特性:从上到下碰到的第一个[p,q]之间的结点就是最近公共祖先
class Solution {
public:
TreeNode* traversal(TreeNode* root, TreeNode* p, TreeNode* q){
if(root==nullptr) return nullptr;
if(root->val>=p->val&&root->val<=q->val) return root;
TreeNode* left=lowestCommonAncestor(root->left,p,q);
TreeNode* right=lowestCommonAncestor(root->right,p,q);
if(left&&right) return root;
return left ? left : right;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(p->val>q->val) swap(p,q);
return traversal(root,p,q);
}
};
注意还是需要这一段
TreeNode* left=lowestCommonAncestor(root->left,p,q);
TreeNode* right=lowestCommonAncestor(root->right,p,q);
if(left&&right) return root;
return left ? left : right;
否则返回值就没有人接收了。一开始写的错误版本:
lowestCommonAncestor(root->left,p,q);
lowestCommonAncestor(root->right,p,q);
return nullptr;
701.二叉搜索树中的插入操作
BST的插入操作,其实只要加入叶子节点就行,不涉及重构
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(root==nullptr){
TreeNode* node=new TreeNode(val);
return node;
}
if (val < root->val) root->left = insertIntoBST(root->left, val);
if (val > root->val) root->right = insertIntoBST(root->right, val);
return root;
}
};
这个写法需要注意一下 root->left = insertIntoBST(root->left, val); 这样就做到了递归修改树的结点。
if (val < root->val) root->left = insertIntoBST(root->left, val);
if (val > root->val) root->right = insertIntoBST(root->right, val);
450.删除二叉搜索树中的节点
删除BST的结点就涉及到重构了
第一想法:删掉某一个结点,要把它的子结点全部重新插入二叉树。=》需要一个数组来记录叶子节点。
这样的时间复杂度就很高了。还是有一些算法可以使用的:
浙公网安备 33010602011771号