由中序和後序重建二叉樹
總時間限制: 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確定 有左...