235. 二叉搜索树的最近公共祖先
题目链接/文章讲解:https://programmercarl.com/0235.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88.html
视频讲解:https://www.bilibili.com/video/BV1Zt4y1F7ww
看到这首先要回顾一下上一篇的题,利用回溯从底向上搜索,遇到一个节点的左子树里有p,右子树里有q,那么当前节点就是最近公共祖先。
那么本题是二叉搜索树,二叉搜索树是有序的,p和q以及我们要找的最近公共祖先res之间的关系,简单来看如图所示。
假设p>q,那么res就在[p,q]这个闭区间内。(这里不区分pq谁大)
①root的值同时大于p q的值,说明下一次需要递归传入左子树进行判断
②root的值同时小于p q的值,说明下一次需要递归传入右子树进行判断
class Solution {
private:
TreeNode* traversal(TreeNode* cur,TreeNode* p,TreeNode* q){
if(cur==NULL) return cur;
if(cur->val > p->val && cur->val > q->val) {
TreeNode* left = traversal(cur->left,p,q);
if(left!=NULL){
return left;
}
}
if(cur->val < p->val && cur->val < q->val){
TreeNode* right = traversal(cur->right, p, q);
if(right != NULL){
return right;
}
}
return cur;
}
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return traversal(root, p, q);
}
};
题目链接/文章讲解:https://programmercarl.com/0701.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E6%8F%92%E5%85%A5%E6%93%8D%E4%BD%9C.html
视频讲解:https://www.bilibili.com/video/BV1Et4y1c78Y
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;
}
};
题目链接/文章讲解:https://programmercarl.com/0450.%E5%88%A0%E9%99%A4%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html
视频讲解:https://www.bilibili.com/video/BV1tP41177us
这个就是学数据结构的时候,关于二叉搜索树的删除操作,代码实现步骤和理论过程是一致的,需要分不同的情况
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(root == nullptr)
return root;
if(root->val == key){
if(root->left == nullptr && root->right == nullptr){
delete root;
return nullptr;
}
else if(root->left==nullptr)
{
auto retNode = root->right;
delete root;
return retNode;
}
else if(root->right == nullptr)
{
auto retNode = root->left;
delete root;
return retNode;
}
else{
TreeNode* cur = root->right;
while(cur->left != nullptr)
cur = cur->left;
cur->left = root->left;
TreeNode* tmp = root;
root = root->right;
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;
}
};