c_lc_二叉搜索树的最近公共祖先 & 二叉树的最近公共祖先(利用性质 | 从p,q开始存储每个结点的父亲)
Lowest Common Ancestor of a BST
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)”
思路
这里是BST,三种很直观的情况:
- p.val<root.val、q.val>p.val 时,LCA一定只能是根
- p.val<root.val、q.val<p.val 时,LCA一定存在于左子树
- p.val>root.val、q.val>p.val 时,LCA一定存在于左子树,而对于左右子树而言,也一定可以用情况一来讨论
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while (root!=null) {
if (p.val<root.val && q.val<root.val) root=root.left;
else if (p.val>root.val && q.val>root.val) root=root.right;
else break;
}
return root;
}
}
Lowest Common Ancestor of a Binary Tree
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
class Solution {
Map<Integer, TreeNode> fa;
Set<Integer> vis;
void dfs(TreeNode root) {
if (root.left!=null) {
fa.put(root.left.val, root);
dfs(root.left);
}if (root.right!=null) {
fa.put(root.right.val, root);
dfs(root.right);
}
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
fa=new HashMap<>();
vis=new HashSet<>();
dfs(root);
while (p!=null) {
vis.add(p.val);
p=fa.get(p.val);
}
while (q!=null) {
if (vis.contains(q.val)) break;
q=fa.get(q.val);
}
return q;
}
}