题目描述
输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。
输入描述:
输入第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。
输出描述:
可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。 每种遍历结果输出一行。每行最后一个数据之后有一个空格。 输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。
输入例子:
5 1 6 5 9 8
输出例子:
1 6 5 9 8 1 5 6 8 9 5 8 9 6 1
AC code:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<map>
#include<math.h>
#include<string.h>
#include<queue>
#include<vector>
#include<set>
#define LL long long
#define exp 1e-9
#define MAXN 1000010
using namespace std;
typedef struct BTNode{
int data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
void InsertBT(BTNode *&bt,int x)
{
int fg;
BTNode *p,*pre;
p=pre=bt;
if(bt==NULL)
{
bt=(BTNode *)malloc(sizeof(BTNode));
bt->data=x;
bt->lchild=bt->rchild=NULL;
}
else
{
fg=1;
while(p)
{
if(p->data>x)
{
pre=p;
p=p->lchild;
}
else if(p->data<x)
{
pre=p;
p=p->rchild;
}
else//相等不插入
{
fg=0;
break;
}
}
if(fg)
{
p=(BTNode *)malloc(sizeof(BTNode));
p->data=x;
p->lchild=NULL;
p->rchild=NULL;
if(pre->data>p->data)
{
pre->lchild=p;
}
else
{
pre->rchild=p;
}
}
}
}
void PreOrder(BTNode *bt)
{
if(bt!=NULL)
{
printf("%d ",bt->data);
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
void InOrder(BTNode *bt)
{
if(bt!=NULL)
{
InOrder(bt->lchild);
printf("%d ",bt->data);
InOrder(bt->rchild);
}
}
void PostOrder(BTNode *bt)
{
if(bt!=NULL)
{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
printf("%d ",bt->data);
}
}
int main()
{
// freopen("D:\\in.txt","r",stdin);
int i,n,x;
while(scanf("%d",&n)!=EOF)
{
BTNode *bt=NULL;
for(i=1;i<=n;i++)
{
scanf("%d",&x);
InsertBT(bt,x);
}
PreOrder(bt);
puts("");
InOrder(bt);
puts("");
PostOrder(bt);
puts("");
}
return 0;
}