算法通关村第八关——寻找最近公共祖先问题

最近公共祖先问题

6的祖先结点有3和5,7的是3、5、2,所以6和7的最近公共祖先是5。如果要用代码实现,需要考虑好几种情况。根据以上定义,若oot是p,q的最近公共祖先,则只可能为以下情况之一:

(1)p和q在root的子树中,且分列root的异侧(即分别在左、右子树中);

(2)p=root,且q在root的左或右子树中;

(3)q=root,且p在root的左或右子树中;

需要判断的逻辑是:

·1.如果Ieft和right都为null,说明在该子树root里p和q一个都没找到,直接返回null即可。
·2.如果left和right都不为null,说明p和q分别在root的两侧,直接返回root即可。
·3.当right为空,let不为空时,先判断一下root是不是p或者q,如果是说明q和p一个是另一个的祖先,直接返回就好了,否测说明right子树里什么都没查到,此时需要递归的去左子树查即可。
·4如果Ieft为空,而right不为空,说明是与情况3相反的情况。

public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null || root == p || root == q){ return root;}
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        if (left == null && right == null){ return null;} // 1.
        if (left == null){ return right;} // 3.
        if (right == null){ return left;} // 4.
        return root; // 2. if(left != null and right != null)
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值