树结构练习——排序二叉树的中序遍历
Time Limit: 1000 ms
Memory Limit: 65536 KiB
Problem Description
在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值。现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序遍历的结果。
Input
输入包含多组数据,每组数据格式如下。
第一行包含一个整数n,为关键值的个数,关键值用整数表示。(n<=1000)
第二行包含n个整数,保证每个整数在int范围之内。
Output
为给定的数据建立排序二叉树,并输出其中序遍历结果,每个输出占一行。
Sample Input
1 2 2 1 20
Sample Output
2 1 20
Hint
Source
赵利强
解题思路:了解一种新的结构,排序二叉树,很有意思的一点,如果按照中序输出,就是一个升序的序列。建树的时候要判断一下新插入元素的值,依然是通过递归建立树。
AC代码:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef int elem;
int flag;
typedef struct node
{
elem date;
struct node *lchild;
struct node *rchild;
}BiTree;
BiTree *createTree(int a, BiTree *root)
{
if(!root)
{
root = (BiTree *)malloc(sizeof(BiTree));
root->date = a;
root->lchild = root->rchild = NULL;
}
else///插入新的元素时,额外判断一下
{
if(a < root->date)
{
root->lchild = createTree(a, root->lchild);
}
else
{
root->rchild = createTree(a, root->rchild);
}
}
return root;
}
void mid_treverse(BiTree *root)
{
if(root != NULL)
{
mid_treverse(root->lchild);
if(flag == 0)
{
printf("%d",root->date);
flag = 1;
}
else
{
printf(" %d",root->date);
}
mid_treverse(root->rchild);
}
}
int main()
{
int n;
int a;
BiTree *root;
while(~scanf("%d", &n))
{
flag = 0;
root = NULL;
int i;
for(i = 0; i < n; i++)
{
scanf("%d", &a);
root = createTree(a,root);
}
mid_treverse(root);
printf("\n");
}
return 0;
}