hdu 1710 Binary Tree Traversals

     本題的考點是告訴你二叉樹的前序遍歷和中序遍歷,求後序遍歷。我的思路是:因爲前序遍歷是先遍歷祖先在遍歷兒子,所以第一個(前序遍歷)點一定是根節點。後邊依次加入前序遍歷中的點,沿着根往下建立,如果待加入的節點的值出現的順序(中序遍歷)在本節點的前面,那麼這個點在本節點的左邊,否者在右邊,知道節點爲空,加入節點。後面以此類推,就建立了一棵二叉樹。接着後序遍歷就可以了……

代碼如下:
#include<cstdio>
#include<iostream>

using namespace std;

struct tree
{
int num;
tree *l,*r;
};

int T1[1005],T2[1005];
int n;

void init()
{
int i;
for(i=0;i<n;i++)
scanf("%d",&T1[i]);
for(i=0;i<n;i++)
scanf("%d",&T2[i]);
}
int Judge(int x,int y)
{
int i;
for(i=0;i<n;i++)
{
if(x==T2[i])
return 1;
if(y==T2[i])
return 0;
}
return 1;
}

void out(tree *t)//後序遍歷
{
if(t->l)
out(t->l);
if(t->r)
out(t->r);
T1[n++]=t->num;
}
void BuildTree(tree *&t,int x)//建樹
{
if(t==NULL)
{
t=new tree();
t->num=x;
t->l=NULL;
t->r=NULL;
}
else
{
if(Judge(x,t->num))
{
BuildTree(t->l,x);
}
else
{
BuildTree(t->r,x);
}
}
}
void make()
{
tree *root=NULL;
int i;
for(i=0;i<n;i++)
{
BuildTree(root,T1[i]);
}
n=0;
out(root);
for(i=0;i<n-1;i++)
printf("%d ",T1[i]);
printf("%d\n",T1[i]);
}

int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
make();
}
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章