1. 程式人生 > 其它 >二叉樹的建立與遍歷

二叉樹的建立與遍歷

#include<bits/stdc++.h>

using namespace std;
const int N = 1010;
int pre[N],in[N],post[N]; // 先序.中序.後序
int k;
struct node{
int value;
node *l,*r;  
node(int value = 0 , node *l = NULL , node *r = NULL) : value(value),l(l),r(r){} // 在結構體內構造一個函式方便以後給結構體賦值,詳情請看——結構體建構函式
};
void buildtree(int l, int r , int &t,node* &root){// &在這裡作“引用”,詳情請看——引用詳解
int flag = -1;
for(int i = l ; i <= r ; i++)
{
if(in[i]==pre[t]){
flag = i ;
break;
}
}
if(flag == -1) return;
root = new node(in[flag]); //給當前root建立一個記憶體空間,讓root指向該空間的地址,則空間內的值即為root的value,且將in[flag]的值賦給value
t++;
if(flag>l) buildtree(l , flag - 1 , t , root->l); //遞迴思想寫不下自己去學一下,然後再把本題樣例拿草稿紙代入一下
if(flag<r) buildtree(flag + 1 , r , t , root->r);
}
void preorder(node *root){ //先序輸出(應該能看懂就不解釋了)
if(root!= NULL){
post[k++] = root->value; 
preorder(root->l);
preorder(root->r);
}
}
void inorder(node *root){//中序輸出
if(root!= NULL){
inorder(root->l);
post[k++] = root->value;
inorder(root->r);
}
}
void postorder(node *root){//後序輸出
if(root != NULL){
postorder(root->l);
postorder(root->r);
post[k++] = root->value;
}
}
void remove_tree(node *root){//釋放空間
if(root == NULL)return;
remove_tree(root->l);
remove_tree(root->r);
delete root;
}
int main()
{
int n;
while(~scanf("%d",&n)){
for(int i = 1 ; i <= n ; i++)scanf("%d",&pre[i]);
for(int j = 1 ; j <= n ; j++)scanf("%d",&in[j]);
node *root;
int t = 1;
buildtree(1 , n , t , root);
k = 0;
postorder(root);
for(int i = 0 ; i < k ; i++) printf("%d%c",post[i],i==k-1?'\n':' ');
remove_tree(root);
}
return 0;
}

樣例:

輸入:

9

1 2 4 7 3 5 8 9 6//先序

4 7 2 1 8 5 9 3 6//中序

輸出:

7 4 2 8 9 5 6 3 1//後序