重建二叉樹

2021-08-05 20:19:48 字數 1933 閱讀 4361

給出一棵二叉樹的先序遍歷和中序遍歷,求後序遍歷。

tree recovery

利用遞迴構造二叉樹的後序遍歷。

先序遍歷特點:根節點->左孩子->右孩子

中序遍歷特點:左孩子->根節點->右孩子

後序遍歷特點:左孩子->右孩子->根節點

假設先序遍歷序列為s1,中序遍歷序列為s2,後序遍歷序列為s

根據先序遍歷特點可知s1[0]為當前二叉樹的根節點,在中序遍歷中找到根節點的位置p,根據中序遍歷的特點可知s2裡p之前都屬於當前樹的左子樹,即當前樹的左子樹有p個節點。

我們可以構造出這樣的遞迴結構:build(int n,char* s1,char* s2,char* s);

(其中n代表二叉樹的節點數,s1為先序遍歷序列,s2為中序遍歷序列,s為後序遍歷序列

)。根據先序遍歷特點可知s1+1即為左子樹的根節點,左子樹共有p個節點,由於左子樹的節點都集中在s2中p點的前面,所以中序遍歷不用變,後序遍歷也不用變。於是我們就構造出了左子樹的遞迴狀態:build(p,s1+1,s2,s);

根據先序遍歷和中序遍歷的特點可知s1+p+1為右子樹的根節點,右子樹共有n-p-1個節點(即總節點-左子樹的節點-根節點),由於右子樹的節點集中在s2中p點的後面,所以中序遍歷應該從s2+p+1開始(即右子樹的根節點),根據後序遍歷特點,右子樹的後序遍歷應該從s+p開始,因為減去了根節點,根節點需要到最後再加上。於是我們就構造出了左子樹的遞迴狀態:build(n-p-1,s1+p+1,s2+p+1,s+p);

最後將根節點新增到最後:s[n-1]=s1[0];

**:

#include#includevoid build(int n,char* s1,char* s2,char* s)

int main()

return 0;

}

以上沒有建樹,直接求出了另一種序列,下面給出建樹的模板。

例題:樹的遍歷

題意:給出中序遍歷和後序遍歷,求層次遍歷。

先模擬建樹。根據後序遍歷的特點,最後那個值一定是根節點。我們還需要借助中序遍歷來確定左子樹的範圍和右子樹的範圍。中序遍歷中,根節點的左邊為左子樹,右邊為右子樹。有了左子樹的範圍,就可以求出左子樹的節點數,進而就可以求出後序遍歷中左子樹的範圍和右子樹的範圍。不斷遞迴建樹,知道右邊界小於左邊界,return。

定義函式:

void build(tree &t,int ml,int mr,int pl,int pr)

//ml、mr為中序遍歷的左右邊界,pl、pr為後序遍歷的左右邊界

步驟一:建立節點;

步驟二:找到當前樹中根節點在中序遍歷中的位置r,計算左子樹的節點數ln;

步驟三:遞迴左子樹。

build(t->lch,ml,r-1,pl,pl+ln-1);

中序遍歷中左邊界不變,右邊界變為根節點的位置-1;

後序遍歷中左邊界不變,右邊界變為左邊界pl加上左子樹的節點數ln-1;

步驟四:遞迴右子樹。

build(t->rch,r+1,mr,pl+ln,pr-1);

中序遍歷中左邊界變為根節點的位置+1,右邊界不變;

後序遍歷中左邊界變為左邊界+ln,即左子樹的右邊界+1,右邊界變為根節點-1;

建樹完成!

然後就可以對其進行層次遍歷之類的操作。

#include #include#include#include#includeusing namespace std;

int n,mid[35],post[35];

typedef struct node

*tree;

int find(int x)

void bfs(tree &t)

printf("\n");

}int main()

{ scanf("%d",&n);

for(int i=0;i

二叉樹 重建二叉樹

問題 給定二叉樹的前序遍歷結果和中序遍歷結果,恢復出原二叉樹。假設二叉樹中的元素都不重複,給定二叉樹的前序遍歷序列,二叉樹的中序遍歷序列。看到此題,我首先想到的是尋找根節點,由前序遍歷序列可以看出根節點為1,此時通過中序遍歷可以看出來4,7,2在根節點的左子樹,5,3,8,6在樹的右節點。此時我們可...

二叉樹 重建二叉樹

題目給定兩個陣列,乙個是前序遍歷陣列 preorder 乙個是中序遍歷陣列 inorder 要求輸出還原二叉樹 核心在於我們要理解前序和中序便利的特點 前序遍歷 根節點 左節點 右節點 中序遍歷 左節點 根節點 右節點 所以我們從二叉樹的根節點開始重構 也就是preorder的第乙個值 同時用乙個m...

二叉樹重建

摘自劉汝佳的 演算法競賽入門經典 preorder t t 的根結點 preorder t 的左子樹 preorder t 的右子樹 inorder t inorder t 的左子樹 t 的根結點 inorder t 的右子樹 postorder t postorder t 的左子樹 postord...