48 lines
1.6 KiB
Java
48 lines
1.6 KiB
Java
|
package tree;
|
|||
|
|
|||
|
import java.util.HashMap;
|
|||
|
import java.util.HashSet;
|
|||
|
|
|||
|
/**
|
|||
|
* 题目: 236. 二叉树的最近公共祖先 (lowestCommonAncestor)
|
|||
|
* 描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
|
|||
|
* 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
|
|||
|
|
|||
|
|
|||
|
* 链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/
|
|||
|
|
|||
|
*/
|
|||
|
public class LowestCommonAncestor {
|
|||
|
void helper(HashMap<TreeNode, TreeNode> map, TreeNode father, TreeNode cur) {
|
|||
|
if (cur == null)
|
|||
|
return;
|
|||
|
map.put(cur, father);
|
|||
|
helper(map, cur, cur.left);
|
|||
|
helper(map, cur, cur.right);
|
|||
|
}
|
|||
|
|
|||
|
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
|
|||
|
HashMap<TreeNode, TreeNode> map = new HashMap<>();
|
|||
|
HashSet<TreeNode> set = new HashSet<>();
|
|||
|
map.put(root, null);
|
|||
|
helper(map, root, root.left);
|
|||
|
helper(map, root, root.right);
|
|||
|
|
|||
|
// 将 p 以及其所有祖先加入 set
|
|||
|
TreeNode tp = p;
|
|||
|
while (tp != null) {
|
|||
|
set.add(tp);
|
|||
|
tp = map.get(tp);
|
|||
|
}
|
|||
|
|
|||
|
// 从 q 开始,找到第一个出现在 p 祖先链中的节点
|
|||
|
tp = q;
|
|||
|
while (tp != null) {
|
|||
|
if (set.contains(tp))
|
|||
|
return tp;
|
|||
|
tp = map.get(tp);
|
|||
|
}
|
|||
|
return null; // 理论上不可能执行到这里,因为肯定存在公共祖先
|
|||
|
}
|
|||
|
}
|