最小公共祖先 II

问题: 给定两个节点,求它们在一棵二叉树中的最小公共祖先。每个节点除了有左右子树外,还有一个指向其父节点的指针。

思路: 由于有指向父节点的指针,两个节点沿着父指针到达根节点形成两根链表,问题转化为求两链表交点。先分别求链表长度,再将两链表放在同一起点,同时前进直到相遇。

java代码:

TreeNode LCA2(TreeNode root,TreeNode p,TreeNode q){
        if(root==null||p==null||q==null)
            return null;
        TreeNode pq=new TreeNode(0);
        //找出p,q在二叉树中对应的节点
        help(root,p,q,pq);
        TreeNode pp=pq.left,qq=pq.right;
        if(pp==null||qq==null)
            return null;
        int lenp=0,lenq=0;
        TreeNode up1=pp,up2=qq;
        while(up1!=root){
            up1=up1.parent;
            lenp++;
        }
        while(up2!=root){
            up2=up2.parent;
            lenq++;
        }
        up1=pp;
        up2=qq;
        while(lenp>lenq){
            up1=up1.parent;
            lenp--;
        }
        while(lenq>lenp){
            up2=up2.parent;
            lenq--;
        }
        while(up1!=up2){
            up1=up1.parent;
            up2=up2.parent;
        }
        return up1;
    }
    void help(TreeNode root,TreeNode p,TreeNode q,TreeNode pq){
        if(root==null)
            return;
        if(root==p)
            pq.left=p;
        if(root==q)
            pq.right=q;
        if(pq.left==null||pq.right==null){
            help(root.left,p,q,pq);
            help(root.right,p,q,pq);
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章