leetcode 二叉搜索树的最近公共祖先(非二叉搜索树也适用) 简单

 

 做题的时候忽略了是二叉搜索树,就直接做的。最后的效率也不低:时间超过 91.82%,空间超过 72.45%

(二叉搜索树的话更简单,这里放上对普通二叉树也适用的代码)

 

辅助函数返回值 pair<bool, TreeNode*>,当 pair.first 为真时,表示找到了最近公共祖先,存放于 pair.second,递归直接返回即可。

否则,就直接判断 pair.second 是否为 null,如果不为 null 就表示找到了 p, q 中的某一个。

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        return _lowestCommonAncestor(root, p, q).second;
    }
    pair<bool, TreeNode*> _lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q) {
        if(root == nullptr || root == p || root == q) return {false, root};
        auto lef = _lowestCommonAncestor(root -> left, p, q);
        auto rig = _lowestCommonAncestor(root -> right, p, q);
        if(lef.first || rig.first) {
            return lef.first ? lef : rig;
        }
        if(lef.second == p && rig.second == q || lef.second == q && rig.second == p)  // 好像可以写成 if(lef.second && rig.second)
            return {true, root};
        return lef.second ? lef : rig;
    }
};

 

posted @ 2021-07-25 11:12  rookie_Acmer  阅读(42)  评论(0)    收藏  举报