最小公共祖先 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);
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章