Skip to content

236 二叉树的最近公共祖先

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

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

题解

要是我们能从下往上找就好了,比如说任意节点p,q。 如果我们能从下往上找,那么直接往上走碰到的第一个节点就是公共祖先。 但是二叉树是不可能从下往上找的,但是回溯(对于后序遍历)可以。所以我们可以通过后序遍历来实现。

递归三部曲

1.确定递归函数的参数和返回值, 参数是root, p, q。 返回值是最近公共祖先。

2.确定终止条件,如果是null返回,如果碰到p,也返回,表明找到了就不需要继续往下找了。同理q也是 所以终止条件为 if(!root || root.val === p.val || root.val === q.val) return root

3.单层逻辑,如果左子树有值,右子树也有值,说明此时就是结果(p, q分别列在左右子树结果中) 如果左子树有值,右子树没值,返回左子树,表明左子树已经找到,但是右子树没有找到。 如果左子树没值,右子树有值,返回右子树,表明右子树已经找到,但是左子树没有找到。 如果都没有值,返回null,表明在这个子树上并没有找到p, q祖先。

javascript
    const left = lowestCommonAncestor(root.left, p, q)
    const right = lowestCommonAncestor(root.right, p, q)

    if(left && right) {
        //当前节点是结果
        return root
    }
    if(left && !right) {
        //采用left当做结果
        return left
    }
    if(!left && right) {
        //采用right当做结果
        return right
    }
    return null

整体解法

javascript
var lowestCommonAncestor = function(root, p, q) {
    if(!root || root.val === p.val || root.val === q.val) {
        return root
    }
    const left = lowestCommonAncestor(root.left, p, q)
    const right = lowestCommonAncestor(root.right, p, q)

    if(left && right) {
        //当前节点是结果
        return root
    }
    if(left && !right) {
        //采用left当做结果
        return left
    }
    if(!left && right) {
        //采用right当做结果
        return right
    }
    return null
};

上次更新于: