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

72 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

1.题目

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

百度百科中最近公共祖先的定义为:“对于有根树 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.思路

对于二叉树的题,我们往往会用到递归和遍历两种解答方法,而寻找公共祖先这种题目,一看就会想到递归,因为两个节点可能会处于不同的层级相互之间需要保留联系才能找到,层序遍历的话往往不好保存两个节点之间的联系。

我们寻找公共节点,首先我们需要从最底层开始寻找节点,因为从最底层开始寻找,第一个公共祖先一定就是最近的公共祖先,采用后序遍历的方式,先递归再对节点做处理,先获取到左右子树的结果是否同时包含目标节点,然后判断是否满足当前节点等于目标节点同时另一个目标节点在左右子树中,如果满足则说明当前节点即为最近公共子节点,不然的话就判断是否左右子树包含目标节点或者当前节点满足目标节点。

var lowestCommonAncestor = function(root, p, q) {
    let d
    let deep = (root,p,q)=>{
        if(!root)return null
        let left = deep(root.left,p,q)
        let right = deep(root.right,p,q)
        if((left&&right)||(root===p||root===q)&&(left||right)){
            d = root
        }
        return (left||right)|| (root===p||root===q)
    }
    deep(root,p,q)
    return d
};