二叉排序树 - 九度教程第35题
题目:
时间限制:1 秒 内存限制:32 兆 特殊判题:否
题目描述:
输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。
输入:
输入第一行包括一个整数 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
提示:
输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。
来源: 2005 年华中科技大学计算机保研机试真题
二叉排序树:
二叉排序树是一棵特殊的二叉树,它是一棵二叉树但同时满足如下条件:
对于树上任意一个结点,其上的数值必大于等于其左子树上任意结点数值,必小于等于其右子树上任意结点的数值。
二叉排序树的存储方式与二叉树保持一致。
二叉排序树建树方式:
从二叉树的插入开始了解其建树方式,对二叉排序树插入数字x:
1. 若当前树为空,则x为其根结点。
2. 若当前结点大于x,则x插入其左子树;若当前结点小于x,则x插入其右子树;若当前结点等于x,则根据具体情况选择插入左右子树或者直接忽略。
由于各个数字插入的顺序不同,所得到的二叉排序树的形态也很可能不同,所以不同的插入顺序对二叉排序树的形态有重要的影响。但是,所有的二叉排序树都有一个共同的特点:若对二叉排序树进行中序遍历,那么其遍历结果必然是一个递增序列,这也是二叉排序树名字的来由,通过建立二叉排序树就能对原无序序列进行排序,并实现动态维护。
解析:
该题考察对于给定的输入顺序建立二叉排序树,并对二叉排序树进行前序、中序、后序遍历并输出遍历结果。
代码:
#include<stdio.h>
#include<string.h>
struct Node{ //二叉树结构体
Node *lchild; //左儿子指针
Node *rchild; //右儿子指针
int c; //保存数字
}Tree[110]; //静态数组
int loc; //静态数组中被使用元素个数
Node *creat() //申请未使用的结点
{
Tree[loc].lchild=Tree[loc].rchild=NULL;//初始化左右儿子为空
return &Tree[loc++];//返回指针,且loc累加
}
void postOrder(Node *T) //后序遍历
{
if(T->lchild!=NULL)
{
postOrder(T->lchild);
}
if(T->rchild!=NULL)
{
postOrder(T->rchild);
}
printf("%d ",T->c);
}
void inOrder(Node *T) //中序遍历
{
if(T->lchild!=NULL)
{
inOrder(T->lchild);
}
printf("%d ",T->c);
if(T->rchild!=NULL)
{
inOrder(T->rchild);
}
}
void preOrder(Node *T) //前序遍历
{
printf("%d ",T->c);
if(T->lchild!=NULL)
{
preOrder(T->lchild);
}
if(T->rchild!=NULL)
{
preOrder(T->rchild);
}
}
Node *Insert(Node *T,int x)//插入数字
{
if(T==NULL) //若当前树为空
{
T=creat(); //建立结点
T->c=x; //数字直接插入其根结点
return T; //返回根结点指针
}
else if(x<T->c) //若x小于根结点数值
{
T->lchild=Insert(T->lchild,x);//插入到左子树上
}
else if(x>T->c) //若x大于根结点数值
{
T->rchild=Insert(T->rchild,x);//插入到右子树上,若根结点数值与x一样,根据题目要求直接忽略
}
return T; //返回根结点指针
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
loc=0;
Node *T=NULL; //二叉排序树树根结点为空
for(int i=0;i<n;i++)//依次输入n个数字
{
int x;
scanf("%d",&x);
T=Insert(T,x);//插入到排序树中
}
preOrder(T); //前序遍历
printf("\n"); //输出空行
inOrder(T); //中序遍历
printf("\n");
postOrder(T); //后序遍历
printf("\n");
}
return 0;
}