本文講的是非遞迴呼叫的中序遍歷,如果想知道遞迴呼叫的中序遍歷可以看我的另一篇博文
分析: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 非遞迴實現 根據前序遍歷訪問的順序,優先訪問根節點,然後再分別訪問左孩子和右孩子。即對於任一節點,其可看做是根節點,因此可以直接訪問,訪問完之後,若其左孩子 不為空,按相同規則訪問它的左子樹,當訪問其左子樹時,在訪問...
樹的遞迴,非遞迴,層序遍歷
長期以來,很多同學對數的遍歷都有一定的恐懼,其實多練練,多研究,發現是不難的,現在我來把數的構建,遞迴遍歷和非遞迴遍歷為大家整理一下,所有的 均為我自己敲出來的,並且經過了測試,希望給大家乙個參考,若有不足之處,歡迎指出交流。首先我把數存在陣列中,字子樹為空,則用 代替,根據這個陣列建立二叉樹的,然...