樹的非遞迴呼叫遍歷(中序遍歷)

2021-08-21 16:00:48 字數 624 閱讀 9235

本文講的是非遞迴呼叫的中序遍歷,如果想知道遞迴呼叫的中序遍歷可以看我的另一篇博文

分析:1、訪問順序

中序遍歷是當左子樹為空或者左子樹已經訪問完畢以後,在訪問根節點。訪問完根節點在訪問右子樹。

2、選擇什麼型別的資料結構(棧?佇列?)

因為先走到的後訪問,後走到的先訪問,所以很顯然是棧結構。

3、節點所有路徑的情況

步驟1、如果節點有左子樹,該節點入棧。

如果沒有左節點,訪問該節點。

步驟2、如果節點有右子樹,重複步驟1.

如果沒有右子樹,根據棧頂元素回退,並訪問棧頂元素,在訪問右子樹,重複步驟1.

如果棧為空,表示遍歷結束。

注意:入棧的節點表示,本身沒有被訪問過,同時右子樹也沒有被訪問過。

下面看一下實現過程:

bitnode * left(bitnode *root, stack&s)

while(root->lchild != null)

return root;

}void inorder1(bitnode *root)

else if (!s.empty())//判斷棧是否為空  為空則表示已經遍歷結束了

else}}

void main()

樹中序遍歷 非遞迴

步驟1 結點的所有路徑情況 如果結點有左子樹,該結點入棧 如果結點沒有左子樹,訪問該結點 如果結點有右子樹,重複步驟1 如果結點沒有右子樹 結點訪問完畢 回退,讓棧頂元素出棧,訪問棧頂元素,並訪問右子樹,重複步驟1 如果棧為空,表示遍歷結束。include iostream include stac...

中序遍歷(非遞迴)

前序遍歷 前序遍歷的遞迴實現 void preorder bintree root 非遞迴實現 根據前序遍歷訪問的順序,優先訪問根節點,然後再分別訪問左孩子和右孩子。即對於任一節點,其可看做是根節點,因此可以直接訪問,訪問完之後,若其左孩子 不為空,按相同規則訪問它的左子樹,當訪問其左子樹時,在訪問...

樹的遞迴,非遞迴,層序遍歷

長期以來,很多同學對數的遍歷都有一定的恐懼,其實多練練,多研究,發現是不難的,現在我來把數的構建,遞迴遍歷和非遞迴遍歷為大家整理一下,所有的 均為我自己敲出來的,並且經過了測試,希望給大家乙個參考,若有不足之處,歡迎指出交流。首先我把數存在陣列中,字子樹為空,則用 代替,根據這個陣列建立二叉樹的,然...