题目
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。"
解题思路
- 利用Map存储当前节点和对应的子节点;
- 利用递归遍历整棵树,将数据存放到Map当中;
- 遍历Map获取最近的公共祖先。
代码展示
java
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
Map<TreeNode, List<Integer>> data = new HashMap<>();
dfs(root,data);
int min = Integer.MAX_VALUE;
TreeNode ans = null;
for (TreeNode treeNode : data.keySet()){
List<Integer> list = data.get(treeNode);
int size = list.size();
if(list.contains(p.val) && list.contains(q.val)){
if(min > size){
min = size;
ans = treeNode;
}
}
}
return ans;
}
public List<Integer> dfs(TreeNode root, Map<TreeNode, List<Integer>> data){
if(root == null){
return new ArrayList<>();
}
List<Integer> store = new ArrayList<>();
store.add(root.val);
store.addAll(dfs(root.left,data));
store.addAll(dfs(root.right,data));
data.putIfAbsent(root, store);
return store;
}
}