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