給出二叉樹的前序遍歷序列和中序遍歷序列,求後序遍歷序列。比如節點內儲存的資料型別為char的二叉樹,給出前序遍歷序列"abdec",中序遍歷序列"dbeac",則輸出後序遍歷序列。
可以寫乙個遞迴函式實現,首先由前序遍歷序列的第乙個元素確定根節點,然後再中序遍歷序列中找出等於該元素的位置索引,則根據中序遍歷的定義,該位置以左為左子樹,以右為右子樹。根據前序遍歷的定義,第乙個元素之後跟著的也分別是左子樹的前序遍歷和右子樹的前序遍歷,由中序序列可以分別確定這兩個子樹序列的長度,從而可以分隔。對兩個子樹的前序遍歷序列和中序遍歷序列分別遞迴進行後序遍歷,然後最終列印根節點,即為整棵樹的後續遍歷。
轉換演算法不難,難點在於沒有左子樹和沒有右子樹的情況。如果沒有左子樹,則不對左子樹遞迴遍歷,右子樹也一樣。如果既沒有左子樹也沒有右子樹,則退化為葉子節點,這是遞迴處理的邊界情況。
c**如下:
#include #include void postorder(char *pre1, char *pre2, char *in1, char *in2)
{ assert(pre2-pre1>=0);
assert(in2-in1>=0);
assert(pre2-pre1 == in2-in1);
int len = pre2 - pre1 + 1;
char root = *pre1;
int i, j;
for(i=0; in1[i]!=root && i
二叉樹 由前序遍歷和中序遍歷重建二叉樹
由前序遍歷和中序遍歷重建二叉樹 前序序列 1 2 3 4 5 6 中序序列 3 2 4 1 6 5 思路 前序遍歷第乙個是根節點。中序遍歷根節點左側為左子樹,根右側為右子樹。那麼先構造根節點,根節點左側都為左子樹,根右側都為右子樹。然後對左右子樹遞迴式的構造即可。封裝 binarytreenode ...
由前序遍歷和中序遍歷重建二叉樹
唯一的難點就是確定當前節點的左子樹的根節點和右子樹的根節點分別在前序遍歷陣列的位置。例如 先序遍歷陣列pre 1 2 3 4 5 6 7 中序遍歷陣列in 3 2 4 1 6 5 7 1是當前根節點,它在pre中的位置 pre start 0接著在in中找到1的位置,即分割點 j 3當前樹根所囊括的...
由前序遍歷和中序遍歷重建二叉樹
程式設計之美3.9 給出前序遍歷和中序遍歷,重新建立二叉樹,後序遍歷輸出。如下 view code 1 include 2 include 3 4using namespace std 56 struct node7 1213 void aftertra node proot 1419 aftert...