1. 簡介
依舊是下面的這三句話:
先序遍歷:根左右
中序遍歷:左根右
后序遍歷:左右根
后序遍歷就是在訪問二叉樹的結(jié)點的時候采用,先左,再右,再根的方式,對于一個最簡單的訪問而言如圖,先訪問左節(jié)點B,之后訪問右結(jié)點C,最后訪問根節(jié)點A,后序遍歷的訪問順序就是BCA
然而實際上的遍歷訪問并沒有那么簡單,往往是多個結(jié)點相互嵌套構(gòu)成的二叉樹,
如圖所示,在訪問遍歷一開始的時候,先訪問左節(jié)點B再訪問右結(jié)點C最后訪問A,但由于B結(jié)點其中也包含了新的結(jié)點,就猶如之前介紹的那樣,在面對處理的結(jié)點后還存在有與之相聯(lián)的結(jié)點的時候,需要優(yōu)先處理其的子結(jié)點,這也是“遞歸”的基本思路,因此,由于B屬于DG的根結(jié)點,我們相較于B,應(yīng)該先訪問D結(jié)點,而又由于D結(jié)點屬于EF的根結(jié)點,我們就又變成先訪問E結(jié)點,E屬于最末端了,根據(jù)后序遍歷左右根的訪問順序,依次生成EFDGB作為一個整體,接著我們需要訪問C,由于C又是^HC之中的根結(jié)點,我們先訪問這個空結(jié)點,又因為其是一個空的結(jié)點,我們會跳過,就變成了HC的訪問順序,那么最后在匯總的時候EFDGB作為左節(jié)點,HC作為右結(jié)點,A作為根結(jié)點,完成我們最終的遍歷順序EFDGBHCA。
2.代碼實現(xiàn)
續(xù)上文的代碼,巧妙利用遞歸,與前文的代碼只有一個順序的區(qū)別:
//樹的后序遍歷 Post-order traversal void postorder(Node* node){ if (node != NULL) { inorder(node->left); inorder(node->right); printf("%d ",node->data); } }
3. 后綴表達式(逆波蘭式)
逆波蘭式與波蘭式不同,波蘭式采用先序遍歷的方式遍歷訪問我們的公式順序,常規(guī)式則就是我們熟悉的中序方式,而逆波蘭式采用后續(xù)遍歷的方式進行訪問。
如圖,為常規(guī)表達式:(a+b)*c
其二叉樹的表現(xiàn)形式為:
而逆波蘭式的表達方式就是ab+c* ,相較于波蘭式,逆波蘭式則就是將符號進行后移,其在計算機中的讀取運算概念也符合棧的思路,因此沒有什么特殊的不同,在考研/軟考/算法競賽中,比較常見的一類提醒就是波蘭式,常規(guī)表達式,逆波蘭式之間的互相轉(zhuǎn)化和基本數(shù)學(xué)運算。
4. 相關(guān)問題
l 二叉樹的遍歷習(xí)題:1734題
請回答這一顆樹的后序遍歷是多少?
請回答這一顆樹的后序遍歷是多少?
l 請回答((a+b)+(c+d))*e作為轉(zhuǎn)換成后綴表達式如何,如何表示。
1734 | 二叉樹遍歷 |
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導(dǎo)課程