JavaScript | 二叉树中找到两个节点的最近公共祖先

在二叉树中找到两个节点的最近公共祖先

https://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116

/*
 * function TreeNode(x) {
 *   this.val = x;
 *   this.left = null;
 *   this.right = null;
 * }
 */

/**
 * 
 * @param root TreeNode类 
 * @param o1 int整型 
 * @param o2 int整型 
 * @return int整型
 */
function lowestCommonAncestor( root ,  o1 ,  o2 ) {
    const node = traverse(root, o1, o2);
    return node?.val || null;
}

function traverse(root, o1, o2) {
    if(!root || root.val == o1 || root.val == o2) return root;

    const left = traverse(root.left, o1, o2);
    const right = traverse(root.right, o1, o2);

    if(!left && !right) return null;
    if(!left) return right;
    if(!right) return left;
    return root;
}

module.exports = {
    lowestCommonAncestor : lowestCommonAncestor
};

思路:

这道题就是查找二叉树两个节点的最近公共祖先的通用解法,二叉树没说是二叉搜索树,所以不能用二叉搜索树的特性去搜索。

找公共祖先的通用解法: 后序遍历+回溯

function traverse(root, o1, o2) {
    // 递归终止条件
    if(!root || root.val == o1 || root.val == o2) return root;
    // 后续遍历
    const left = traverse(root.left, o1, o2);
    const right = traverse(root.right, o1, o2);
    // 处理中节点的时候,考虑下面几种情况:
    // 1. 左右子树都为空 不存在公共祖先
    // 2. 左子树为空,公共祖先在右子树
    // 3. 右子树为空,公共祖先在左子树
    // 4. o1,o2 出现在两边,那么此时root就为公共祖先
    if(!left && !right) return null;
    if(!left) return right;
    if(!right) return left;
    return root;
}

全部评论

相关推荐

11-28 17:48
中山大学 C++
点赞 评论 收藏
分享
拒绝无效加班的小师弟很中意你:求职意向没有,年龄、课程冗余信息可以删掉,需要提升项目经历。排版需要修改。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务