Skip to content

力扣链接:236.二叉树的最近公共祖先

难度:⭐⭐

解题关键词:二叉树递归

解题思路:使用后序遍历递归判断当前节点是否满足条件,如果该节点的左子树和右子树有两个目标节点,或者当前节点是目标节点的其中一个节点,然后该节点左右子树中包含另外一个节点,那么该节点就是要找的最近公共祖先。

typescript
function lowestCommonAncestor(
  root: TreeNode | null,
  p: TreeNode | null,
  q: TreeNode | null
): TreeNode | null {
  // 最后答案
  let ans = null;

  const dfs = (
    root: TreeNode | null,
    p: TreeNode | null,
    q: TreeNode | null
  ) => {
    // 如果当前节点为空,那么不包含目标节点
    if (root === null) return false;

    // 递归判断左子树中是够包含目标节点
    const lSon = dfs(root.left, p, q);
    // 递归判断右子树中是够包含目标节点
    const rSon = dfs(root.right, p, q);

    // 1.左右子树包含两个目标节点
    // 2.当前节点是目标节点其中一个,并且左右子树中包含另一个
    if (
      (lSon && rSon) ||
      ([p.val, q.val].includes(root.val) && (lSon || rSon))
    ) {
      ans = root;
    }

    // 左右子树包含 或者 当前节点是其中一个
    return lSon || rSon || root.val === p.val || root.val === q.val;
  };

  dfs(root, p, q);

  return ans;
}