天天看點

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

一、中序周遊(遞歸)

實作的思路和前序周遊其實差不多,但是通路的順序就是:左節點->根節點->右節點,為了節省一些篇幅把節點數設定的少一些,重在大家的了解,話不多說直接上代碼:

結構圖

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述 圖解

第一步:

(1)執行inOrderRecur(Node root)方法,root不為null,于是調用preOrderRecur(root.left)方法,通路節點B;

(2)B不為空,繼續調用inOrderRecur(B.left)方法,通路節點D;

(3)D不為空,調用inOrderRecur(D.left)方法,為空,傳回;

(4)列印“D”。

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第二步:

(1)然後調用inOrderRecur(D.right)方法,為空,傳回;

(2)該層執行完畢,傳回上一層,列印“B”

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第三步:

(1)然後調用inOrderRecur(B.right)方法,通路到“E”,然後調用inOrderRecur(E.left),為空,列印“E”;

(2)然後調用inOrderRecur(E.right)方法,為空,傳回;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第四步:

(1)執行完該層,傳回上一層B層,B層也執行完畢,傳回上一層A層,列印“A”;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第五步:

(1)然後調用inOrderRecur(A.right)方法,通路到C,再調用inOrderRecur(C.left),通路到F,再調inOrderRecur(F.left),為空,傳回,列印“F”;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第六步:

(1)然後調用inOrderRecur(F.right)方法,為空傳回,該層執行完畢,傳回上一層C,列印“C”;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第七步:

(1)然後調用inOrderRecur(C.right)方法,通路到G,在調用inOrderRecur(G.left),為空傳回,列印“G”;

(2)然後調用inOrderRecur(G.right)方法,為空,傳回;

(2)G層執行完畢,傳回上一層C層,C曾也執行完畢,傳回上一層A層,A層也執行完畢,最後跳出遞歸,結束;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

最後輸出結果為:DBEAFCG

二、中序周遊(非遞歸)

public void inOrder() {
        Node current = root;
        //把LinkedList作為棧使用
        LinkedList s = new LinkedList();while (current != null || !s.isEmpty()) {while (current != null) {
                s.addFirst(current);
                current = current.left;
            }if (!s.isEmpty()) {
                current = s.removeFirst();
                System.out.print(current.data + " -> ");
                current = current.right;
            }
        }
    }
           

結構

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述 圖解

第一步:

(1)s.addFirst(current);

(2)A.left不為空,把節點B放入棧中;

(3)B.left不為空,把節點D放入一棧中;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第二步:

(1)D.left為空,跳出裡層的while循環,輸出“D”;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第三步:

(1)D.right為空,跳出裡層的while循環,輸出B;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第四步:

(1)B.right通路到E,E進入棧内;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第五步:

(1)B.right通路到E,E進入棧内;

(2)E.left為空,跳出裡層的while循環,輸出“E”;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第六步:

(1)E.right為空,跳出裡層的while循環,輸出“A”;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第六步:

(1)A.right通路到C,C進入棧;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第六步:

(1)C.left通路到F,F進入棧;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第六步:

(1)F.left為空,跳出裡層的while循環,輸出“F”;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第七步:

(1)F.right為空,跳出裡層的while循環,輸出“C”;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第八步:

(1)C.right不為空,通路到G,G進入棧;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

第九步:

(1)G.left為空,跳出裡層的while循環,輸出G;

(2)G.right為空,跳出裡層的while循環,判斷棧為空,結束;

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

在這裡插入圖檔描述

1、每日一薦 2020-03 彙總

2、『不要再問我頭像如何變灰了,試試這幾種濾鏡吧!』

3、LeetCode專題 - 小島題

4、一文帶你AC四道題【位運算】

5、或許是一本可以徹底改變你刷 LeetCode 效率的題解書

6、外部排序:如何用 2GB記憶體給 20 億個整數排序?

二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)
二叉樹的非遞歸周遊_Java實作二叉樹中序周遊(遞歸+非遞歸)

如果覺得文章不錯,幫忙點個在看呗