二叉树的最近公共祖先

题目链接:

236. 二叉树的最近公共祖先 - 力扣(LeetCode)

解题思路:

首先 题目指出,所给的 p,q节点是必然包含在 root 二叉树中,所以不会存在说没有答案

 该题是适用于二叉树递归解决问题

在递归时 如果 root 为 null 说明当前无解 返回

if (root === null) return false;

我们定义 一个 dfs 函数来遍历这个二叉树,那么对于当前这道题会有俩种情况

    let leftNode = dfs(root.left, p, q);
    let rightNode = dfs(root.right, p, q);

当前节点的左子树和右子树分别包含了 p 和 q ,所以预存当前节点最近公共祖先

当前节点的左子树和右子树的其中一个包含 p 和 q,也预存当前节点为最近公共祖先

    if (
      (leftNode && rightNode) ||
      ((root.val === p?.val || root.val === q?.val) && (leftNode || rightNode))
    ) {
      node = root;
    }

最后我们返回所需要的当前节点是否包含 p q 节点的真值

return leftNode || rightNode || root.val === p?.val || root.val === q?.val;

代码:

function lowestCommonAncestor(
  root: TreeNode | null,
  p: TreeNode | null,
  q: TreeNode | null
): TreeNode | null {
  // 最近的祖先
  let node: TreeNode | null = null;

  function dfs(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null) {
    if (root === null) return false;

    let leftNode = dfs(root.left, p, q);
    let rightNode = dfs(root.right, p, q);
    // 俩种情况,第一种:当前节点就是包含p和q
    // 第二种:左子树或者右子树其中一个包含
    if (
      (leftNode && rightNode) ||
      ((root.val === p?.val || root.val === q?.val) && (leftNode || rightNode))
    ) {
      node = root;
    }
    // 返回
    return leftNode || rightNode || root.val === p?.val || root.val === q?.val;
  }
  dfs(root, p, q);

  return node;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值