题目
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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; } }