遍歷概念
所謂遍歷(Traversal)是指沿著某條搜索路線
遍歷是二叉樹上最重要的運算之一
遍歷方案
從二叉樹的遞歸定義可知
(
(
(
以上三種操作有六種執行次序
NLR
注意
前三種次序與後三種次序對稱
根據訪問結點操作發生位置命名
① NLR
——訪問結點的操作發生在遍歷其左右子樹之前
② LNR
——訪問結點的操作發生在遍歷其左右子樹之中(間)
③ LRN
——訪問結點的操作發生在遍歷其左右子樹之後
注意
由於被訪問的結點必是某子樹的根
遍歷算法
若二叉樹非空
(
(
(
若二叉樹非空
(
(
(
若二叉樹非空
(
(
(
用二叉鏈表做為存儲結構
void InOrder(BinTree T)
{ //算法裡①~⑥是為了說明執行過程加入的標號
① if(T) { // 如果二叉樹非空
② InOrder(T
③ printf(
④ InOrder(T
⑤ }
⑥ } // InOrder
遍歷序列
三種遞歸遍歷算法的搜索路線相同(如下圖虛線所示)
具體線路為
從根結點出發
(
中序遍歷二叉樹時
【例】中序遍歷上圖所示的二叉樹時
D B A E C F
(
先序遍歷二叉樹時
【例】先序遍歷上圖所示的二叉樹時
A B D C E F
(
後序遍歷二叉樹時
【例】後序遍歷上圖所示的二叉樹時
D B E F C A
注意
(
(
【例】上圖所示的二叉樹中結點C
二叉鏈表的構造
基於先序遍歷的構造
注意
先序序列中必須加入虛結點以示空指針的位置
【例】
建立上圖所示二叉樹
假設虛結點輸入時以空格字符表示
void CreateBinTree (BinTree *T)
{ //構造二叉鏈表
char ch
if((ch=getchar())==
else{ //讀人非空格
*T=(BinTNode *)malloc(sizeof(BinTNode))
(*T)
CreateBinTree(&(*T)
CreateBinTree(&(*T)
}
}
注意
調用該算法時
【例】設root是一根指針(即它的類型是BinTree)
構造二叉鏈表的其他方法【參見參考書目】
二叉樹建立過程見【動畫演示】
二叉樹的應用
【參見練習】
From:http://tw.wingwit.com/Article/program/sjjg/201311/22857.html