二叉(搜索)树——最近公共祖先

可能是因为做过图论的原因,做这个题的时候直接是最巧妙的解法,

原题1:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/

原题2:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/

是二叉搜索树,甚至没有利用树的特性解题

思路是:
选用递归,
那么return的一定是最近公共祖先

即有语句:如果p、q子节点都有找到,那么root即为最近公共祖先
if (l != nullptr && r != nullptr) return root;
否则,优先选择非空的return
return l != nullptr ? l : r;

巧妙的点在于,如果当前找到为p或p子节点,那么就可以return了,
不管另一个p或q子节点在何处,都只需要在return的路径上进行处理就ok。

class Solution
{
public:
    TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q)
    {
        if (root == nullptr || root == p || root == q)
            return root;
        TreeNode *l = lowestCommonAncestor(root->left, p, q);
        TreeNode *r = lowestCommonAncestor(root->right, p, q);
        if (l != nullptr && r != nullptr)
            return root;
        return l != nullptr ? l : r;
    }
};
简单易懂

官方题解:

class Solution
{
public:
    TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q)
    {
        if (root == nullptr)
            return root;
        if (root->val > p->val && root->val > q->val)
            return lowestCommonAncestor(root->left, p, q);
        if (root->val < p->val && root->val < q->val)
            return lowestCommonAncestor(root->right, p, q);
        return root;
    }
};
利用特性易懂root

 

posted @ 2022-03-01 11:41  Renhr  阅读(7)  评论(0)    收藏  举报