题目:http://www.patest.cn/contests/pat-a-practise/1099
题目可以分为四个步骤:建树,排序,中序遍历,层次遍历
建树就是输入,注意把双亲域也填上,后边中序遍历如果是非递归的话要用到。
然后将输入的数据序列从小到大排好序,这样在中序遍历的时候就只要一个一个填进去就好了。
中序遍历我用的是树操作中常见的求下一个节点的运算,是非递归的。
层次遍历我用的是队列,或者说广度优先搜索。
整体来看这题也就是稍微麻烦一些,并不难。
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
//1ms 360kb
const int MAXN=110;
struct Node
{
int value;
Node* l,*r,*p;
}nodes[MAXN];
int n;
Node* nextNode(Node* now)
{
if (now->r){
now=now->r;
while (now->l)
now=now->l;
return now;
}
while (now->p!=NULL && now==now->p->r)
now=now->p;
return now->p;
}
void printTree(Node* root)
{
Node* dl[MAXN];
int h=0,t=0,coun=0;
dl[h]=root;
while (h<=t)
{
if (++coun==n) printf("%d",dl[h]->value);
else printf("%d ",dl[h]->value);
if (dl[h]->l!=NULL)
dl[++t]=dl[h]->l;
if (dl[h]->r!=NULL)
dl[++t]=dl[h]->r;
h++;
}
}
int main()
{
scanf("%d",&n);
for (int i=0;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if (a==-1)
nodes[i].l= NULL;
else
{
nodes[i].l=&nodes[a];
nodes[a].p=&nodes[i];
}
if (b==-1)
nodes[i].r= NULL;
else
{
nodes[i].r=&nodes[b];
nodes[b].p=&nodes[i];
}
}
int a[MAXN];
for (int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
Node* now=&nodes[0];
while (now->l) now=now->l;
for (int i=0;i<n;i++)
{
now->value=a[i];
now=nextNode(now);
}
printTree(&nodes[0]);
return 0;
}