劍指offer 面試題8:二叉樹的下一個節點(中序遍歷)java

Github 源碼地址 

public class BinaryTreeGetNext {
    public static void main(String args[]) {
        getNext(new BinaryTreeNode(3));
    }

    private static BinaryTreeNode getNext(BinaryTreeNode treeNode) {
        if (treeNode == null) {
            return null;
        }
        BinaryTreeNode mNext = null;
        // 有右子樹
        if (treeNode.right != null) {
            BinaryTreeNode mRight = treeNode.right;
            while (mRight.left != null) {
                mRight = mRight.left;
            }
            mNext = mRight;
        }
        // 沒有右子樹
        else if (treeNode.parent != null) {
            BinaryTreeNode mCurNode = treeNode;
            BinaryTreeNode mParNode = mCurNode.parent;
            while (mParNode != null && mCurNode == mParNode.right) {
                mCurNode = mParNode;
                mParNode = mParNode.parent;
            }
            mNext = mParNode;
        }
        return mNext;
    }

    private static class BinaryTreeNode {
        int val;
        BinaryTreeNode left;
        BinaryTreeNode right;
        BinaryTreeNode parent;

        BinaryTreeNode(int val) {
            this.val = val;
        }
    }
}

 

 

要點提示:

  • 1、在當前節點有右子樹的情況下,循環遍歷右子樹的左子節點及其子節點的左子節點
  • 2、沒有右子樹的情況,判斷循環結束的關鍵在於在當前節點父節點非空且當前節點是否等於其父節點的右子節點
  • 3、當前節點等於其父節點的右子節點 表明要繼續向上遍歷父節點,否則遍歷結束
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章