[C++]leetcode题解之二叉搜索树的最近公共祖先

本文介绍了如何利用二叉搜索树特性,在给定两个节点p和q的情况下,通过构造并比较它们到根节点的路径,找出它们最近公共祖先的高效算法。通过路径遍历和比较实现,适用于查找具有特定结构的二叉搜索树中的最近共同祖先节点。
摘要由CSDN通过智能技术生成

leetcode235
问题描述:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例
在这里插入图片描述
在这里插入图片描述
思路:题目中给出的是一棵「二叉搜索树」,因此我们可以快速地找出树中的某个节点以及从根节点到该节点的路径,例如我们需要找到节点 p:
我们从根节点开始遍历;如果当前节点就是 p,那么成功地找到了节点;如果当前节点的值大于 p 的值,说明 p 应该在当前节点的左子树,因此之后遍历当前子树的左子树;如果当前节点的值小于p 的值,说明 p 应该在当前节点的右子树,因此之后遍历当前子树的右子树。

当我们用上述方法得到了从根节点到 p 和 q的路径之后,我们只需要从头到尾遍历他们的路径,最后一个相同的值即为它们的分岔点。

方法

//查找二叉搜索树到任意结点的路径
vector<TreeNode *>getPath(TreeNode *root,TreeNode *target){
    vector<TreeNode *>path;					//存储路径
    TreeNode *node=root;
    while(node!=target){
        path.emplace_back(node);
        if(node->val>target->val){
            //在左子树进行查找
            node=node->left;
        }else{
            //在右子树进行查找
            node=node->right;
        }
    }
    //存储target结点
    path.emplace_back(node);
    return path;
}
//查找二叉搜索树两个结点的最近公共祖先
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q){
    //查找从根节点到p结点的路径
    auto p_path=getPath(root,p);
    //查找从根节点到q结点的路径
    auto q_path=getPath(root,q);
    //两个路径的最后一个相同的结点即为最近公共结点
    int lowest_node_position=0;
    for(int i=0,j=0;i<p_path.size()&&j<q_path.size();++i,++j){
        if(p_path[i]==q_path[j]){
            lowest_node_position=i;
        }else
            break;
    }
    return p_path[lowest_node_position];
}

相关阅读
[c++]查找二叉树根节点到任意结点的路径

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值