LC236

LC link

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的左右子树

    1. 如果左右子树的递归都有结果,说明p、q分居root左右子树,return root
    2. 如果只有一个子树递归调用有结果,说明p、q都在这个子树,返回子树递归的结果
    3. 如果两个子树递归结果都为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
}
posted @ 2022-09-22 14:32  tulintao  阅读(15)  评论(0编辑  收藏  举报