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

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

http://www.nowcoder.com/questionTerminal/e0cc33a83afe4530bcec46eba3325116

题目描述
给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。

示例1
输入
[3,5,1,6,2,0,8,#,#,7,4],5,1
返回值
3

解法

    // 解法: 递归(后序遍历框架)
    //  终止条件:1. 越过叶节点,直接返回null; 2. root == o1 || root == o2, 返回 root.
    //  递归: 分别获得左右子树上的最近公共祖先节点. 
    //        left=lowestCommonAncestor(root->left, o1, o2)
    //        right=lowestCommonAncestor(root->right, o1, o2)
    //  返回结果:根据左右子树结果,判断最终返回结果。
    //        1. left == null && right == null, return null  // o1, o2 不在root的两子树上
    //        2. left == null && right != null, return right // o1, o2 在root 右子树
    //        3. left != null && right == null, retut left  // o1, o2 在root 左子树
    //        4. left != null && right != null, return root // o1, o2 分别root的两子树上
    // 时间O(N), 空间O(N)
    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        if (root == nullptr) return INT_MIN;
        if (root->val == o1 || root->val == o2) return root->val;
        int left = lowestCommonAncestor(root->left, o1, o2);
        int right = lowestCommonAncestor(root->right, o1, o2);
        if (left == INT_MIN ) return right;
        if (right == INT_MIN) return left;
        return root->val;
    }
全部评论

相关推荐

一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务