LeetCode系列236—二叉树的最近公共祖先

题意

236. 二叉树的最近公共祖先

题解

方法一:递归

class Solution {
    
    
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    
    
        if(root == nullptr || root == p || root == q) return root;
        TreeNode *left = lowestCommonAncestor(root->left, p, q);
        TreeNode *right = lowestCommonAncestor(root->right, p, q);
        if(left == nullptr && right == nullptr) return nullptr; // 1.
        if(left == nullptr) return right; // 3.
        if(right == nullptr) return left; // 4.
        return root; // 2. if(left != null and right != null)
    }
};

作者:jyd
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/solution/236-er-cha-shu-de-zui-jin-gong-gong-zu-xian-hou-xu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

方法二:哈希表存储父节点

class Solution {
    
    
public:
    unordered_map<int, TreeNode*> fa;
    unordered_map<int, bool> vis;
    void dfs(TreeNode* root){
    
    
        if (root->left != nullptr) {
    
    
            fa[root->left->val] = root;
            dfs(root->left);
        }
        if (root->right != nullptr) {
    
    
            fa[root->right->val] = root;
            dfs(root->right);
        }
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    
    
        fa[root->val] = nullptr;
        dfs(root);
        while (p != nullptr) {
    
    
            vis[p->val] = true;
            p = fa[p->val];
        }
        while (q != nullptr) {
    
    
            if (vis[q->val]) return q;
            q = fa[q->val];
        }
        return nullptr;
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/solution/er-cha-shu-de-zui-jin-gong-gong-zu-xian-by-leetc-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

参考

二叉树的最近公共祖先
236. 二叉树的最近公共祖先(DFS ,清晰图解)

Guess you like

Origin blog.csdn.net/younothings/article/details/120293069