前言必读!http://blog.youkuaiyun.com/hnust_v/article/details/51747743
问题 M: 二叉查找树(Ⅱ)-文本显示
时间限制: 1 Sec 内存限制: 128 MB
提交: 130 解决: 60
[提交][状态][讨论版]
题目描述
本任务是在空二叉查找树的基础上,依次插入一些关键字,然后文本方式显示该树。要求树中不能有重复关键字。
输入
由多组数据 组成。
每组数据由两行组成。第一行是待插入关键字的数目n(1<=n<=100)。第2行是n个空格分开的正整数,值不超过100。
输出
对于每一组数据,显示对应的二叉查找树,相当于常规树形左旋90度。见样例。 注意每一层缩进为4,每一行行尾没有空格符号。
样例输入
6
4 2 1 5 3 6
样例输出
6
5
4
3
2
1
提示
[提交][状态][讨论版]
需要注意的建树时记录层数以便于打印
#include <bits/stdc++.h>
using namespace std;
typedef struct LNode
{
LNode *Lchild,*Rchild;
int info,flor;
}LNode,*Fin;
LNode Q[10000];
void Print(Fin P)
{
if(P==NULL) return;
Print(P->Rchild);
for(int i=1;i<=P->flor;i++) printf(" ");
printf("%d\n",P->info);
Print(P->Lchild);
}
void Add(int a,int FLOR,LNode *P,LNode *Q)
{
// if(P.Lchild) printf("P==%d (*P.Lchild).info==%d\n",P.info,(*P.Lchild).info);
Q->flor=FLOR;
if(P->info > a)
{
if(P->Lchild != NULL) Add(a,FLOR+1,P->Lchild,Q);
else {P->Lchild = Q;return;}
}
else if(P->info < a)
{
if(P->Rchild != NULL) Add(a,FLOR+1,P->Rchild,Q);
else {P->Rchild = Q;return;}
}
else if(P->info == a) return;
return;
}
void Creat(int n)
{
Fin Root=NULL;
int a;LNode P;
scanf("%d",&a);
P.info=a;P.flor=0;P.Lchild=P.Rchild=NULL;//Print(&P);
Root = &P;
for(int i=2,a;i<=n;i++)
{
scanf("%d",&a);
Q[i].info=a;Q[i].Lchild=Q[i].Rchild=NULL;
// P = *Root;
//printf("i==%d_ a==%d_______________________________\n",i,a);
// printf("P.info==%d\n",P.info);
//if(P.Lchild) printf("P==%d (*P.Lchild).info==%d\n",P.info,(*P.Lchild).info);
Add(a,1,&P,&Q[i]); //Print(Root);
}
Print(Root);
}
int main()
{
//freopen("F:\\test.txt","r",stdin);
//freopen("F:\\tsst.txt","w",stdout);
int n;while(cin>>n) Creat(n);
return 0;
}