二叉樹的下一個結點(模擬)

題目描述
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。

思路:分析每種情況
1.有右子樹,下一節點是右子樹的最左結點
2.沒有右子樹,且該結點是父結點的左孩子,下一結點是該結點的父結點
3.沒有右子樹,且該結點是父結點的右孩子,那麼沿着父結點追溯,直到某個結點是其父結點的左孩子,下個結點就是這個結點的父結點
4.沒有右子樹,也沒有父結點,就返回null

/*
public class TreeLinkNode {
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null;

    TreeLinkNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public TreeLinkNode GetNext(TreeLinkNode pNode)
    {
        TreeLinkNode p=pNode;
        //1.有右子樹,下一節點是右子樹的最左結點
        if(pNode.right!=null){
            p=pNode.right;
            while(p.left!=null){
                p=p.left;
            }
            return p;
        }
        //2.沒有右子樹,且該結點是父結點的左孩子,下一結點是該結點的父結點
        else if(pNode.next!=null&&pNode.next.left==pNode){
            return pNode.next;
        }
        //3.沒有右子樹,且該結點是父結點的右孩子,
        //那麼沿着父結點追溯,直到某個結點是其父結點的左孩子,返回這個結點的父結點
        else if(pNode.next!=null&&pNode.next.right==pNode){
            p=pNode.next;
            while(p.next!=null&&p.next.right==p){
                p=p.next;
            }
            return p.next;
        }
        return null;        
    }
}

寫完之後可以發現23情況是可以合併的,在無右子樹的情況下,也就是隻能追溯父結點時,下一個結點就是某個結點的父結點,該結點是其父結點的左孩子

/*
public class TreeLinkNode {
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null;

    TreeLinkNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public TreeLinkNode GetNext(TreeLinkNode pNode)
    {
        TreeLinkNode p=pNode;
        //1.有右子樹,下一節點是右子樹的最左結點
        if(pNode.right!=null){
            p=pNode.right;
            while(p.left!=null){
                p=p.left;
            }
            return p;
        }
        //2.有父結點,追溯,直到某個結點是其父結點的左孩子,下一節點就是該結點的父結點
        else if(pNode.next!=null){
            p=pNode;
            while(p.next!=null&&p!=p.next.left){
                p=p.next;
            }
            return p.next;
        }
        return null;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章