您的位置:首页 > 产品设计 > UI/UE

PAT研究生入学考试2015.03第四题Build A Binary Search Tree (30) 题解

2015-09-21 16:34 435 查看
题目: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 算法 pat