二叉排序树的建立及遍历
简单介绍:
二叉排序树,顾名思义是一棵二叉树,但是其内部是有序的,遵循规则:根结点<左子树,根结点>右子树
于是上例题:
输入
输入第一行包括一个整数n(1<=n<=100)。接下来的一行包括n个整数。
输出
可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。每种遍历结果输出一行。每行最后一个数据之后有一个空格。
样例输入
1
2
2
8 15
4
21 10 5 39
样例输出
2
2
2
8 15
8 15
15 8
21 10 5 39
5 10 21 39
5 10 39 21
基本上建立二叉树的过程就是一个个插入结点的过程,于是具体看代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
/**结点结构*/
typedef struct node
{
int data;
struct node *lchild,*rchild;
}*BSTree;
BSTree t;
/**建立二叉树过程(即:不断插入新结点的过程)*/
BSTree buildBSTree(BSTree t,int num)
{
node *p,*f,*s;
p=t;
while(p)
{
/**表示该数值已经存在,,很重要,不然就WA了*/
if(num==p->data)
return t;
else
{
f=p;
if(num<p->data)
p=p->lchild;
else
p=p->rchild;
}
}
s=(node *)malloc(sizeof(node));
s->data=num;
s->lchild=NULL;
s->rchild=NULL;
if(!t)
t=s;
else if(num<f->data)
f->lchild=s;
else
f->rchild=s;
return t;
}
/**先序遍历*/
void preOrder(BSTree t)
{
if(t==NULL)
return;
printf("%d ",t->data);
preOrder(t->lchild);
preOrder(t->rchild);
}
/**中序遍历*/
void inOrder(BSTree t)
{
if(t==NULL)
return;
inOrder(t->lchild);
printf("%d ",t->data);
inOrder(t->rchild);
}
/**后序遍历*/
void postOrder(BSTree t)
{
if(t==NULL)
return ;
postOrder(t->lchild);
postOrder(t->rchild);
printf("%d ",t->data);
}
int main()
{
int n;
int a[110];
while(~scanf("%d",&n))
{
if(n==0)
break;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
t=NULL;
for(int i=0;i<n;i++)
{
t=buildBSTree(t,a[i]);
}
preOrder(t);
printf("\n");
inOrder(t);
printf("\n");
postOrder(t);
printf("\n");
}
return 0;
}