问题描述(原题链接)
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
HashMap<Integer,TreeNode> map;
Set<Integer> set;
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//由于node值互不相同,所以把node存起来
map = new HashMap<Integer,TreeNode>();
set = new HashSet<Integer>(); //存储key
dfs(root);
TreeNode temp=p;
while(temp!=null){
set.add(temp.val);
temp=map.get(temp.val);
}
set.add(root.val);
temp=q;
while(temp!=null){
if(!set.contains(temp.val))
temp = map.get(temp.val);
else{
return temp;
}
}
return null;
}
private void dfs(TreeNode root){ //存储父节点
if(root==null)
return;
if(root.left!=null){
map.put(root.left.val,root);
dfs(root.left);
}
if(root.right!=null){
map.put(root.right.val,root);
dfs(root.right);
}
}
}