题目描述
输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。
输入
输入第一行包括一个整数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
提示 [+]
*** 提示已隐藏,点击上方 [+] 可显示 ***
来源
/*********************************
* 日期:2013-3-17
* 作者:SJF0115
* 题号: 天勤 题目1104: 二叉排序树
* 来源:http://acmclub.com/problem.php?id=1104
* 结果:AC
* 来源:2005年华中科技大学计算机研究生保研机试真题
* 总结:
**********************************/
#include<stdio.h>
#include<string.h>
#include<malloc.h>
//二叉树结点
typedef struct BiTNode{
//数据
int data;
//左右孩子指针
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
/*
x 插入的数据
*/
void CreateBalanceTree(BiTree &T,int x){
//若当前树为空
if(T == NULL){
T = (BiTree)malloc(sizeof(BiTNode));
T->data = x;
T->lchild = NULL;
T->rchild = NULL;
}
//如果比当前结点小,插入左子树
else if(x < T->data){
CreateBalanceTree(T->lchild,x);
}
//如果比当前结点大,插入右子树
else if(x > T->data){
CreateBalanceTree(T->rchild,x);
}
//相等不插入
}
//先序遍历
void PreOrder(BiTree T){
//访问根节点
printf("%d ",T->data);
if(T->lchild != NULL){
//访问左子结点
PreOrder(T->lchild);
}
if(T->rchild != NULL){
//访问右子结点
PreOrder(T->rchild);
}
}
//中序遍历
void InOrder(BiTree T){
if(T->lchild != NULL){
//访问左子结点
InOrder(T->lchild);
}
//访问根节点
printf("%d ",T->data);
if(T->rchild != NULL){
//访问右子结点
InOrder(T->rchild);
}
}
//后序遍历
void PostOrder(BiTree T){
if(T->lchild != NULL){
//访问左子结点
PostOrder(T->lchild);
}
if(T->rchild != NULL){
//访问右子结点
PostOrder(T->rchild);
}
//访问根节点
printf("%d ",T->data);
}
int main()
{
int N,x;
while(scanf("%d",&N) != EOF){
//注意N = 0
if(N == 0){
continue;
}
BiTree T = NULL;
//创建二叉平衡树
for(int i = 0;i < N;i++){
scanf("%d",&x);
CreateBalanceTree(T,x);
}
//先序遍历
PreOrder(T);
printf("\n");
//中序遍历
InOrder(T);
printf("\n");
//后序遍历
PostOrder(T);
printf("\n");
}
return 0;
}
注意:N = 0 的情况