【树】面试题 04.08. 首个共同祖先

题目:

设计并实现一个算法,找出二叉树中某两个节点的第一个共同祖先。不得将其他的节点存储在另外的数据结构中。注意:这不一定是二叉搜索树。

例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

3
/ \
5 1
/ \ / \
6 2 0 8
/ \
7 4
示例 1:

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

 

解答:

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null) {
            return null;
        }
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        
        //如果根节点是p,q中的一个,根节点就是首个共同祖先
        if(root == p || root == q) {
            return root;
        }else {
            //如果p,q分散在左右子树中,那么根节点就是首个共同祖先
            if(left != null && right != null) {
                return root;
            }
            //否则,共同祖先就在左子树或者右子树中
            if(left != null || right != null) {
                return left != null ? left : right;
            }
        }
        return null;
    }
}

 

posted @ 2020-10-26 23:25  3KBLACK  阅读(83)  评论(0)    收藏  举报