首个公共祖先 First Common Ancestor

首个公共祖先 First Common Ancestor

如何找出二叉树中某两个节点的第一个共同祖先。不得将其他的节点存储在另外的数据结构中。不一定是BST

[3,4,1,6,2,9,8,null,null,7,5], p = 6, q = 2
公共祖先就是4
p=6,q = 5,公共祖先就是4
p=6,q=8,公共祖先就是3

思路

因为p和q,肯定会存在于这个树中,所以会出现2种情况,
1 左子树中有一个节点p,右子树中有一个节点q,此时的root 就是公共祖先;
2 当前节点就是p或者q,然后左子树或者右子树中存在另一个点,此时的节点就是公共祖先。
设计的递归方法,要在给定的root下寻找哪个节点是p,q的最近公共祖先,如果存在就返回这个节点,否则返回null。
此时上面的2个条件就有用了。

从root开始向下找p,q,当找到了一个目标节点p就返回其p的parent,然后在p的parent的另一个branch寻找q,如果q被发现,那么这个parent就是pq的首个公共祖先,如果在这个子树没有,就退回上层树,继续寻找。

public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }
     
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null){
            return null;
        }
        if(root==p||root==q){
        // 
            return root;
        }

        TreeNode l = lowestCommonAncestor(root.left,p,q);
        TreeNode r = lowestCommonAncestor(root.right,p,q);
        if(l!=null&&r!=null){
		//find two node in left and right
            return root;
        }
        if (l!=null&&r==null){
        //find a node in left and can not find another node in right, so l is answer
            return l;
        }
        //l ==null and r!=null so r is answer
        return r;
    }

Tag

Tree

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eric.Cui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值