LC236
LCA === lowestCommonAncestor
给定一个二叉树 找到该树中两个指定节点的最近公共祖先
对于根节点root、p、q的分布 存在两种可能
- p、q分居root的左右子树,则LCA为root
- p、q存在于root的同一侧子书中,就变成了规模小一点的相同问题
定义递归函数
递归函数: return当前子树 中p & q 的LCA 如果没有LCA就返回null
从根节点root开始往下递归遍历
-
如果遍历到p、q,比如说p,则LCA要么是当前的p(q在p的子树中),那么是p之上的节点(q不在p的子树中),不可能是p之下的节点,不用在继续往下走,返回当前的p
-
当遍历到null节点,空树不存在p、q,没有LCA return null
-
当遍历到节点root不是p、q、null,就递归搜寻root的左右子树
- 如果左右子树的递归都有结果,说明p、q分居root左右子树,return root
- 如果只有一个子树递归调用有结果,说明p、q都在这个子树,返回子树递归的结果
- 如果两个子树递归结果都为null,说明p、q都不在这辆子树中, return null
const lowestCommonAncestor = (root, p, q) => {
if (root === null) return null;
if ([p, q].includes(root)) return root
const left = lowestCommonAncestor(root.left, p, q);
const right = lowestCommonAncestor(root.right, p, q);
if (left && right) return root;
if (left === null) return right
return left
}