由中序和後序重建二叉樹

2021-09-25 09:25:19 字數 1420 閱讀 8382

由中序和後序重建二叉樹

總時間限制: 500ms 記憶體限制: 65535kb

描述我們知道如何按照三種深度優先次序來周遊一棵二叉樹,來得到中根序列、前根序列和後根序列。反過來,如果給定二叉樹的中根序列和後根序列,或者給定中根序列和前根序列,可以重建一二叉樹。本題輸入一棵二叉樹的中根序列和後根序列,要求在記憶體中重建二叉樹,最後輸出這棵二叉樹的前根序列。

用不同的整數來唯一標識二叉樹的每乙個結點,下面的二叉樹

中根序列是9 5 32 67

後根序列9 32 67 5

前根序列5 9 67 32

輸入兩行。第一行是二叉樹的中根序列,第二行是後根序列。每個數字表示的結點之間用空格隔開。結點數字範圍0~65535。暫不必考慮不合理的輸入資料。

輸出一行。由輸入中的中根序列和後根序列重建的二叉樹的前根序列。每個數字表示的結點之間用空格隔開。

樣例輸入

9 5 32 67

9 32 67 5

樣例輸出

5 9 67 32

思路:通過後序序列根結點位於最後的特性確定根結點,再由中序序列根結點左側為左子樹,右側為右子樹特點重建二叉樹,通過先序序列輸出即可。(記得釋放二叉樹)

#includeusing namespace std;

typedef struct _btnbtn;

#define maxn 65536

int inorder [maxn];

int postorder [maxn];

btn *buildtree(int io1,int io2,int po1,int po2)//中序的首尾元素座標,後序的首尾元素座標

//於是左子樹的中序從io1到io1+i-1,後序從po1到po1+i-1

//注意遞迴出口,只有當io1<=io1+i-1即i>=1時才有意義

if(i>=1)

root->lchild=buildtree(io1,io1+i-1,po1,po1+i-1);

//右子樹類似

if(io1+i+1<=io2)

root->rchild=buildtree(io1+i+1,io2,po1+i,po2-1);

//返回根結點

return root;

}void preorder(btn *root)

}//後序遍歷,用於釋放二叉樹

void deletetree(btn *root)

} int main()

i=0;

while(cin>>postorder[i++])

btn *root=buildtree(0,i-1,0,i-1);

preorder(root);

deletetree(root);

return 0;

}

由中序和後序重建二叉樹

time limit 1000ms memory limit 65536k 有疑問?點這裡 已知一顆二叉樹的中序遍歷序列和後序遍歷序列,求二叉樹的深度。輸入資料有多組,輸入t,代表有t組資料。每組資料報含兩個長度小於50的字串。第乙個字串表示二叉樹的中序遍歷,第二個表示二叉樹的後序遍歷。輸出二叉樹的...

由中序序列和前序序列重建二叉樹

definition for binary tree struct treenode class solution treenode construct vector pre,vector vin,int l1,int r1,int l2,int r2 int val pre l1 int inde...

根據後序和中序遍歷重建二叉樹

思路 與已知前序遍歷的區別在於後序序列要從後向前的順序建立。因為前序遍歷根節點在其所有子樹的前面,而後序遍歷的根節點在其所有字數的後面。關鍵在每次讀取兩個陣列的範圍問題 1 in的邊界比較好確定 有左子樹時為 start2,i 1 有右子樹時為 i 1,end2 2 aft的邊界要根據in確定 有左...