使用java實現二叉樹的非遞迴遍歷

2021-08-30 08:52:44 字數 1523 閱讀 4581

在前面的一片部落格中已經介紹了二叉樹遍歷的一些概念以及注意事項,如果有疑惑的可以回過頭看一看。

這裡我們主要討論的是使用非遞迴的演算法實現二叉樹的遍歷

思路:1.使用乙個棧來儲存元素,剛開始的時候將棧頂元素壓入棧

2.當棧不為空的時候做如下操作:彈出棧頂元素並遍歷,依次將出棧結點的右孩子和左孩子入棧

**:

//非遞迴前序遍歷二叉樹

public static void printtree1(node root)

//如果棧頂元素的左孩子不為空,則進棧

if(node.left!=null)

}system.out.println(list);

}

思路:

1.剛開始先把根節點壓入棧,往後每次判斷節點不為空則入棧

2.彈出棧頂元素並遍歷,判斷棧頂元素是否存在右孩子結點,根據結果進行相應的操作

有:繼續將右孩子結點壓棧

無:繼續出棧

**:

//採用非遞迴中序遍歷二叉樹

public static void printtree(node root)

node=stack.pop();

list.add(node);

//如果出棧的結點存在右節點,則指向該節點

if(node.right!=null)else//當棧不為空,或者當前節點引用不為空時迴圈

} while (!stack.isempty()||node!=null);

system.out.println(list);

}

思路:

1.將根節點以及左結點依次入棧

2.獲取棧頂元素,對棧頂元素進行右孩子判斷,諾為空,則遍歷棧頂元素並彈出棧,否則指向右孩子結點

3.重複1-2兩步

重點:這裡需要注意pre變數在遍歷過程中的作用(下方**有詳細注釋該變數的作用)

**:

//非遞迴實現後序遍歷

public static void printtree2(node root)

//獲取棧頂節點

node = stack.get();

//如果棧頂節點的右孩子不為空,說明還得把右子樹壓入棧中,這裡需要注意

這個條件,因為我們在遍歷的過程中,對於(子樹)根節點的判斷會存在兩次

//第一次是彈出左孩子節點後,對根節點進行是否有右孩子的判斷,如果有,則將右孩子壓棧

//第二次是彈出右孩子節點後,這時候因為迴圈的原因(**的原因),我們再次對根節點進行了右孩子判斷,

//所以這裡就必須得判斷該右孩子節點是否在之前的迴圈中已經判斷過了,如果判斷過了,則彈出根節點,否則壓入右孩子節點。

//總的來說,pre節點的作用是用來防止重複遍歷右孩子節點的。

if(node.right!=null&&node.right!=pre)else

} while (node!=null||!stack.isempty());

system.out.println(list);

}

二叉樹遞迴 非遞迴遍歷(Java實現)

遍歷是對一顆二叉樹最基本的操作,有前序遍歷 中序遍歷 後序遍歷和層次遍歷四種,都可以通過遞迴或者資料結構實現。假定葉子結構如下 static classleaf publicstring tostring 1.前序遍歷 先訪問其根節點,再訪問其左節點,最後訪問其右節點。遞迴實現 先訪問其根節點,然後...

二叉樹 非遞迴實現

include include include include define elemtype char using namespace std typedef struct bitnodebitnode,bitree int createbitree bitree t return1 void p...

java非遞迴實現二叉樹的遍歷

1 初始化設定乙個堆疊 2 把根節點指標入棧 3 當棧非空時,迴圈執行步驟3 1到步驟3 3 3 1 出棧取得棧頂節點,訪問該節點 3 2 若該節點的右孩子節點非空,則將該節點的右孩子節點指標入棧 3 3 若該節點的左孩子節點非空,則將該節點的左孩子節點指標入棧 4 演算法結束 步驟如下 至此,中序...