题解 | #二叉搜索树的最近公共祖先#

二叉搜索树的最近公共祖先

https://www.nowcoder.com/practice/d9820119321945f588ed6a26f0a6991f

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param p int整型 
     * @param q int整型 
     * @return int整型
     */
    int fun(TreeNode *r,int n1,int n2)
    {
        if(r->val>=n1 && r->val<=n2)
            return r->val;
        if(r->val>=n2)  //祖先在左侧
            return fun(r->left,n1,n2);             
        else            //祖先在右侧
            return fun(r->right,n1,n2);  
    }
    int lowestCommonAncestor(TreeNode* root, int p, int q) {
        // write code here
        if(p>q)
        {
            int temp = p;
            p=q;
            q=temp;
        }
        return fun(root,p,q);
    }
};

第一步先将p和q按小大顺序交换位置

然后进入递归判断

根据排序二叉树的性质,小值在左子树,大值在右子树

我们可以明确找到结束递归的条件就是当

root->val >= p && root->val<= q,此时root就是最近祖先

为什么呢?经过简单的逻辑分析可以知道,某个节点能将p和q两个节点区分在左右子树上,这个节点就是最近的祖先

而后我们交给下级任务,直至完成。

因为测试条件的特殊性,我们不需要考虑越界问题。

全部评论

相关推荐

11-01 08:48
门头沟学院 C++
伤心的候选人在吵架:佬你不要的,能不能拿户口本证明过户给我。。球球了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务