//非遞迴的後續遍歷二叉樹
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個棧進行維護可能處理需要操作多一點,考研不容...