二叉樹的遍歷及應用

-先序遍歷:

訪問根結點,先序遍歷其左子樹,先序遍歷其右子樹;運用到遞歸
void PreOrderTraversal ( BinTree BT )
{
if ( BT )
{
printf ( “%d”, BT -> Data );
PreOrderTraversal ( BT -> Left );
PreOrderTraversal ( BT -> Right );
}
}

-中序遍歷:

中序遍歷其左子樹,訪問根結點,中序遍歷其右子樹
void InOrderTraversal ( BinTree BT )
{
if ( BT )
{
InOrderTraversal ( BT -> Left );
printf ( “%d”, BT -> Data );
InOrderTraversal ( BT -> Right );
}
}

-后序遍歷:

后序遍歷其左子樹,后序遍歷其右子樹,訪問根結點
void PostOrderTraversal ( BinTree BT )
{
if ( BT )
{
PostOrderTraversal ( BT -> Left );
PostOrderTraversal ( BT -> Right );
printf ( “%d”, BT -> Data );
}
}

三種遍歷過程中經過的結點的路線一樣,只是訪問各結點的時機不同,先序中序后序分別對應第一次訪問時printfData第二次訪問printfData和第三訪問printfData

上面三種方法都是用遞歸,而遞歸根本實現方法是堆棧,現在我們直接用堆棧來實現非遞歸的遍歷算法

eg:中序遍歷非遞歸遍歷算法:
1.遇到一個結點 就把它壓棧 并去遍歷它的左子樹
2.當左子樹遍歷結束后 從棧頂彈出這個結點并訪問它
3.然后按其右指針再去中序遍歷該結點的右子樹

void InOrderTraversal( BinTree BT ){
Stack s = CreateStack ( MaxSize ) // 創建并初始化堆棧s
while( T | | !IsEmpty(s) ){
while(T){ // 一直向左并將沿途結點壓入堆棧
Push ( S, T );
T = T -> Left;
}
if ( !IsEmpty(s) ){
T = Pop(s); // 結點彈出堆棧
printf(“]”, T -> Data); //(訪問)打印結點
T = T -> Right; //轉向右子樹
}
}

-層序遍歷:

二叉樹遍歷的核心問題:二維結構的線性化
一個結點有兩個關聯(左兒子和右兒子)通過一個結點訪問到一個關聯結點(左兒子)后另一個關聯結點(右兒子)怎么辦?這個結點本身怎么辦?這就需要將二維結構線性化。
解決方案:需要一個存儲結構保存暫時不訪問的結點 存儲結構:堆棧、隊列

隊列實現:遍歷從根結點開始 首先將根結點入隊 然后開始執行循環:結點出隊、訪問該結點、其左右兒子入隊(注意隊列中先進先出原則)
序列特征:一層一層訪問的
步驟:
1.從隊列中取出一個元素;2.訪問該元素所指結點;3.若該元素所指結點的左右兒子結點非空 則將其左右兒子的指針順序入隊。
void LevelOrderTraversal( BinTree BT ){
Queue Q ; BinTree T ;
if ( !BT ) return ; //若是空樹直接返回
Q = CreateQueue ( MaxSize ) ; //創建并初始化Q
AddQ( Q, BT ) ;
while( ! IsEmptyQ ( Q ) ){
T = DeleteQ ( Q ) ;
printf ( “%d\n” , T -> Data ) ; //訪問取出隊列的結點
if ( T -> Left ) AddQ( Q, T -> Left );
if ( T -> Right ) AddQ( Q, T -> Right );
}
}

-遍歷二叉樹的應用:

eg:輸出二叉樹中的葉子結點,利用先序遍歷(中序后序類似)
void PreOrderTraversal ( BinTree BT )
{
if ( BT )
{
if( !BT -> Left && !BT -> Right )
printf ( “%d”, BT -> Data );
PreOrderTraversal ( BT -> Left );
PreOrderTraversal ( BT -> Right );
}
}

eg:求二叉樹的高度
void PostOrderGetHeight ( BinTree BT )
{ int HL, HR, MaxH ;
if ( BT )
{
HL = PostOrderGetHeight ( BT -> Left ); // 求左子樹的深度
HR = PostOrderGetHeight ( BT -> Right ); //求右子樹的深度
MaxH = ( HL > HR ) ? HL : HR ; //取左右子樹較大的深度
return ( MaxH + 1 ); //返回樹的深度
}
else return 0; // 空樹深度為0
}

eg:二元運算表達式樹及其遍歷:

002WV0d1zy70G86PztF03&690.png

先序遍歷得到前綴表達式:++a*b c*+*d e f g
中綴表達式會受到運算符優先級的影響,需要在遍歷時加括號
后序遍歷得到后綴表達式:a b c*+d e*f+g*+

eg:由兩種遍歷序列確定二叉樹
(必須知道中序二叉樹,若只是知道前序和后序遍歷 無法確定該二叉樹)
已知先序和中序遍歷序列 來確定一棵二叉樹
步驟:
根據先序遍歷序列第一個結點 確定根結點
根據根結點在中序遍歷序列中分割出左右兩個子序列
對左子樹和右子樹分別遞歸使用相同的方法繼續分解
practice:先序序列:a bcdefghij
中序序列:cbed a hgijf
由先序序列可知根結點為a,通過中序序列可知a左邊為左子樹 a右邊為右子樹,以此類推可確定二叉樹

類似地,已知后序和中序遍歷序列也可以確定一棵二叉樹

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容

  • 數據結構和算法--二叉樹的實現 幾種二叉樹 1、二叉樹 和普通的樹相比,二叉樹有如下特點: 每個結點最多只有兩棵子...
    sunhaiyu閱讀 6,485評論 0 14
  • 編譯環境:python v3.5.0, mac osx 10.11.4 前述內容: 線性表 隊列 堆棧 線性結構...
    擲骰子的求閱讀 2,462評論 1 7
  • 姓名: 李小娜 [嵌牛導讀] :這篇文章主要介紹了Java二叉排序樹,包括二叉排序樹的定義、二叉排序樹的性質、二叉...
    n184閱讀 637評論 0 0
  • 樹和二叉樹 1、樹的定義 樹(Tree)是由一個 或 多個結點 組成的有限集合T,且滿足: ①有且僅有一個稱為根的...
    利伊奧克兒閱讀 1,384評論 0 1
  • 1,從本篇文章/ 音頻/ 視頻中我學到的最重要的概念:It is impossible to learn a la...
    133宋雙芳閱讀 166評論 2 0