最近公共祖先 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
题解:分治法
- 先DFS二叉树,判断p和q是否存在,不存在返回null
- 返回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);
}
}