二叉樹後序遍歷演算法實現

2022-04-10 12:59:27 字數 1051 閱讀 5551

對於二叉樹的三種遍歷方式,它們的難易程度是不一樣的,最簡單的是先序遍歷,其次是中序遍歷,最難的是後序遍歷方式。但是最難的後序遍歷方式,卻可以通過最簡單的先序遍歷方式的變形實現,然後把遍歷的結果逆序一下就搞定了。哈哈,物極必反啊!

先看乙個最簡單的後序的遍歷方法的實現,利用先序遍歷方式的變形,然後逆序

vectorpostorder(treenode *root)

reverse(result.begin(), result.end());

return result;

}

其中用到了乙個std中的reverse函式,下面對這個函式做乙個簡單的說明:

這個函式的標頭檔案為:

#include // std::reverse

這個函式對vector逆序的方法就是把vector的begin()和end()作為兩個引數傳遞進去就ok了

真正的後續遍歷還是比較不容易的,因為除了利用棧之外,還得用乙個標記記住當前這個根節點的左右孩子是否已經遍歷完了,如果左右都已經遍歷完了,那就可以遍歷當前的結點了,如果沒有遍歷完,還必須讓該根節點的右孩子和左孩子依次入棧。

使用的標記方法就是:對於當前的根節點,如果它的子樹已經遍歷完成,在這個當前結點的前乙個當前結點,要麼是它的左孩子(沒有右子樹),要麼是它的右孩子。所以如果前乙個遍歷的結點是它的左孩子或者右孩子時,就說明這個根節點的子樹都已經遍歷完成了。

1.取棧頂元素為當前結點

如果當前結點沒有孩子或者有孩子但是孩子(左或者右)剛剛被訪問過

訪問這個當前結點

更新上乙個訪問結點為當前的結點

做一次彈棧操作

如果有孩子並且孩子(左或者右)都不是上乙個被訪問的結點

把右孩子壓棧,把左孩子壓棧

2.重複1的過程,直到棧為空,結束

後序遍歷**實現:

vectorpostorder(treenode *root)

else

}//while

return result;

}

演算法求二叉樹後序遍歷

演算法原題來自 hihocoder 題目要求使用樹的前序遍歷和中序遍歷求出樹的後序遍歷串。那麼我們想到的方法便是根據前序遍歷和中序遍歷求出這棵樹,那麼就可以很容易的後序遍歷此樹了。根據題目我們先來定義樹節點的資料結構 typedef struct nodenode t 那麼我們可以這樣設定這個函式 ...

2016 11 3 1003 二叉樹後序遍歷

思路 根據二叉樹的前序和中序得到後序,只需要在中序中找到與前序第乙個相同的節點值,即根節點,然後把它分為左右子樹遞迴即可。左子樹遞迴時前序遍歷需要去掉第乙個,右子樹遞迴時則兩個序列都要去掉根節點及其左邊的內容。include include include using namespace std s...

二叉樹的後序遍歷

1 問題描述 給出一棵二叉樹,返回其節點值的後序遍歷。給出一棵二叉樹 1 2 3返回 3,2,1 2 問題實現 與前序遍歷 中序遍歷類似。若二叉樹為空,則空操作返回。否則後序遍歷根節點的左子樹,後序遍歷根節點的右子樹,訪問根節點。3 definition of treenode class tree...