二叉樹的非遞迴遍歷和層次遍歷詳解

2021-10-10 01:46:14 字數 2810 閱讀 999

//非遞迴的後續遍歷二叉樹  

void

hxprint

(tree *tree)

else

else}}

}

邏輯解釋:

按照下圖和上述**

思考一下 每乙個結點都會經歷入棧 出棧 那麼 遍歷方法的結束 就應該是,當所有的結點都已經訪問過 ,並且 當前的棧為空的時候 表示所有的結點都已經輸出 於是有了如下迴圈

此時 再次迴圈 p 為空 p指向棧頂元素 如果過棧頂元素有右孩子 右孩子入棧 p指向右孩子 如果沒有 則 輸出根節點的左孩子結點 此時 再次將p指標修改為 null 這個時候 棧中只有乙個根節點 並且 p結點指向空

再次進入迴圈 p指向棧頂 p這時有右孩子 則將右孩子入棧 修改輔助指標r指向右孩子 再次進入迴圈 出棧 輸出元素 便是輸出的右孩子元素 最後輸出的是根節點元素

大家可以根據下圖 分別進行一遍推演

//非遞迴演算法的先序遍歷

void

xxprint

(tree *tree)if(

!isempty

(s))

}}

//非遞迴演算法的中序遍歷

void

zxprint

(tree *tree)if(

!isempty

(s))

}}

//層次遍歷二叉樹

void

levelprint

(tree *tree)

if(p-

>rchild!=

null)}

}

根節點入隊 進去while迴圈 p指向隊頭結點 輸出隊頭結點 彈出隊頭

如果 p指向的結點有左孩子 左孩子入隊 如果有右孩子 右孩子入隊

第二次進入while迴圈 輸出的即為根節點的左孩子結點 此時p指向的左孩子結點 沒有左右孩子 則結束本次迴圈

第三次進入迴圈 輸出的是根節點的右孩子結點 這時 p指向的結點 沒有左孩子也沒有右孩子 結束總迴圈

這樣輸出的便是層次遍歷的遍歷結果

//非遞迴遍歷中使用的棧的儲存結構

//棧的初始化

stack initstack()

//判斷棧非空

bool

isempty

(stack s)

else

}//入棧

void

push

(stack &s , treenode *node)

//將乙個樹結點入棧

//出棧

treenode *

pop(stack &s)

//出棧的同時返回出棧的結點

treenode *temp = s-

>data[s-

>top]

; s-

>top--

;return temp;

}//獲取棧頂結點

treenode *

gettop

(stack &s)

}//二叉樹初始化方法

tree *

inittree

(treenode *root,

int data)

//插入乙個左孩子結點

bool

insertlchild

(tree *tree,

int data)

//插入乙個右孩子結點

bool

insertrchild

(tree *tree,

int data)

//遞迴遍歷輸出二叉樹

void print (tree *tree)

}//非遞迴的後續遍歷二叉樹

void

hxprint

(tree *tree)

else

else}}

}//非遞迴演算法的先序遍歷

void

xxprint

(tree *tree)if(

!isempty

(s))}}

//非遞迴演算法的中序遍歷

void

zxprint

(tree *tree)if(

!isempty

(s))}}

//層次遍歷二叉樹

二叉樹的遍歷(遞迴,非遞迴,層次)

二叉樹的非遞迴遍歷 二叉樹是一種非常重要的資料結構,很多其它資料結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有前序 中序以及後序三種遍歷方法。因為樹的定義本身就 是遞迴定義,因此採用遞迴的方法去實現樹的三種遍歷不僅容易理解而且 很簡潔。而對於樹的遍歷若採用非遞迴的方法,就要採用棧去模擬實現。在三...

二叉樹遞迴遍歷和非遞迴遍歷

用遞迴和非遞迴實現二叉樹的前序遍歷 中序遍歷和後序遍歷並列印出相應結果。private class treenode 在遞迴呼叫時候系統自動給我們建立棧來儲存資料,而使用非遞迴時候需要我們自己實現棧來儲存資料。遞迴實現前序遍歷public void preorder treenode root sy...

二叉樹各種遞迴非遞迴層次遍歷

typedef struct bitnode bitnode,bitree 注意這裡面的下方的bitnode代表 struct bitnode bitree代表 struct bitnode的指標 直接上程式 沒有什麼特別的難點,除了後序非遞迴遍歷需要些2個棧進行維護可能處理需要操作多一點,考研不容...