代码随想录——26、二叉(搜索)树的最近公共祖先

image
image

递归

最近公共祖先定义:设节点 root 为节点 p,q 的某公共祖先,若其左子节点 root.left 和右子节点root.right 都不是 p,q 的公共祖先,则称 root 是“最近的公共祖先”。

若 root是 p,q的 最近公共祖先 ,则只可能为以下情况之一

  1. 如果p和q在节点root的两侧,那么root就是最近公共祖先
  2. p = root ,且 q 在 root 的左或右子树中
  3. q = root ,且 p 在 root 的左或右子树中

具体解法

  1. 回溯:如果遇到p,q就返回p,q;如果是空节点返回null;如果左右子树不为空则返回当前节点

二叉树只能通过后序遍历(即:回溯)实现从底向上的遍历方式。

  1. 要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果image

代码

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == nullptr)return nullptr;
        if(p == root || q == root)return root;
        TreeNode* left = lowestCommonAncestor(root->left,p,q);
        TreeNode* right = lowestCommonAncestor(root->right,p,q);
        if(left != nullptr && right != nullptr)return root;
        if(left != nullptr)return left;
        if(right != nullptr)return right;
        return nullptr;
    }
};

二叉搜索树

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        // 利用二叉搜索树特性:公共祖先的val一定在p和q的val之间,从上至下递归/搜索找到的第一个满足[p->val,q->val]的就是最近公共祖先
        // 1. 递归法
        if(root == nullptr)return nullptr;
        if(root->val < p->val && root->val < q->val){//小于p和q——cur,p,q / cur,q,p 则访问右子树
            return lowestCommonAncestor(root->right,p,q);
        }if(root->val > p->val && root->val > q->val){
            return lowestCommonAncestor(root->left,p,q);
        }
        return root;//在[p->val,q->val]左闭右闭区间,直接返回

        //2. 迭代法
        //利用二叉搜索树自带方向性
        while(root){
            if(root->val < p->val && root->val < q->val){//小于p和q——cur,p,q / cur,q,p 则访问右子树
                root = root->right;
            }else if(root->val > p->val && root->val > q->val){
                root = root->left;
            }else return root;
        }
        return NULL;

    }
};
posted @   NeroMegumi  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示