最近公共祖先 III——lintcode578

最近公共祖先 III

题目:最近公共祖先 III

给一棵二叉树和二叉树中的两个节点,找到这两个节点的最近公共祖先LCA。
返回 null 如果两个节点在这棵树上不存在最近公共祖先的话。

注意:
这两个节点未必都在这棵树上出现。
每个节点的值都不同

示例:

输入: 
{4, 3, 7, #, #, 5, 6}
3 5
5 6
6 7 
5 8
输出: 
4
7
7
null
解释:
  4
 / \
3   7
   / \
  5   6

LCA(3, 5) = 4
LCA(5, 6) = 7
LCA(6, 7) = 7
LCA(5, 8) = null

题解:分治法

  1. 先DFS二叉树,判断p和q是否存在,不存在返回null
  2. 返回p和q的最近公共祖先
public class Solution {
    Map<TreeNode, TreeNode> map;

    public void dfs(TreeNode father, TreeNode root)
    {
        if(root==null) return;
        map.put(root, father);
        dfs(root, root.left);
        dfs(root, root.right);
    }
    public TreeNode LCA(TreeNode root, TreeNode p, TreeNode q)
    {
        if(root==null|| root==p || root==q) return root;
        TreeNode left=LCA(root.left, p, q);
        TreeNode right=LCA(root.right, p, q);
        if(left==null) return right;
        if(right==null) return left;
        return root;
    }
    public TreeNode lowestCommonAncestor3(TreeNode root, TreeNode p, TreeNode q) {
        map = new HashMap<>();
        dfs(root, root);
        if(!map.containsKey(p) || !map.containsKey(q)) return null;
        return LCA(root, p, q);
    }
}

 

posted @ 2022-01-02 18:53  言思宁  阅读(24)  评论(0编辑  收藏  举报