当前位置:网站首页>LeetCode:236. 二叉树的最近公共祖先

LeetCode:236. 二叉树的最近公共祖先

2022-07-06 08:44:00 Bertil

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1:
在这里插入图片描述

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3

示例 2:
在这里插入图片描述

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

示例 3:

输入:root = [1,2], p = 1, q = 2
输出:1

提示:

  • 树中节点数目在范围 [2, 10^5] 内。
  • -10^9 <= Node.val <= 10^9
  • 所有 Node.val 互不相同 。
  • p != q
  • p 和 q 均存在于给定的二叉树中。

解题思路

1.首先使用递归:root是null或者root等于p或q,说明root是p,q的公共祖先(递归结束),以此来递归左右子树
2.然后在左右子树递归完后进行判断

  • 若左右子树递归函数返回的都不为空,则root就是p,q的公共祖先
  • 若左子树递归函数返回的值为空,则p,q都在右子树,直接返回right即可
  • 若右子树递归函数返回的值为空,则p,q都在左子树,直接返回left即可

代码

/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */
/** * @param {TreeNode} root * @param {TreeNode} p * @param {TreeNode} q * @return {TreeNode} */
var lowestCommonAncestor = function(root, p, q) {
    
    const travelTree = function(root, p, q) {
    
        // 递归终止条件
        if(root === null || root === p|| root === q) {
    
            return root;
        }
        let left = travelTree(root.left, p, q);
        let right = travelTree(root.right, p, q);
      	//如果在某一个节点的左右子树都能找到p和q,说明这个节点就是公共祖先
        if(left !== null && right !== null) {
    
            return root;
        }
        if(left === null) {
    
            return right;
        }
        return left;
    }
    return travelTree(root, p, q);
};
原网站

版权声明
本文为[Bertil]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Bertil/article/details/125000143