题目描述:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
解题思路:递归,哈希表存储父节点
解法一:递归
class Solution {
private TreeNode ans;
public Solution() {
this.ans = null;
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
DFS(root, p, q);
return this.ans;
}
private boolean DFS(TreeNode node, TreeNode p, TreeNode q) {
if (node == null) {
return false;
}
boolean lson = DFS(node.left, p, q);
boolean rson = DFS(node.right, p, q);
if ((lson && rson) || ((node == p || node == q) && (lson || rson))) {
this.ans = node;
}
return lson || rson || (node == p || node == q);
}
}
解法二:哈希表存储父节点
class Solution {
Map<Integer, TreeNode> parent = new HashMap<>();
Set<Integer> visited = new HashSet<>();
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
dfs(root);
while (p != null) {
visited.add(p.val);
p = parent.get(p.val);
}
while (q != null) {
if (visited.contains(q.val)) {
return q;
}
q = parent.get(q.val);
}
return null;
}
private void dfs(TreeNode root) {
if (root.left != null) {
parent.put(root.left.val, root);
dfs(root.left);
}
if (root.right != null) {
parent.put(root.right.val, root);
dfs(root.right);
}
}
}