题目
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
解题思路
- 利用Map存储当前节点和对应的子节点;
- 利用递归遍历整棵树,将数据存放到Map当中;
- 遍历Map获取最近的公共祖先。
代码展示
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;}
}