树结构练习——排序二叉树的中序遍历

树结构练习——排序二叉树的中序遍历

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值。现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序遍历的结果。
 

输入

输入包含多组数据,每组数据格式如下。
第一行包含一个整数n,为关键值的个数,关键值用整数表示。(n<=1000)
第二行包含n个整数,保证每个整数在int范围之内。

输出

为给定的数据建立排序二叉树,并输出其中序遍历结果,每个输出占一行。
 

示例输入

1
2
2
1 20

示例输出

2
1 20

投机取巧代码1:(直接对结点值进行从小到大的排序,并输出)
 1 #include<stdio.h>
 2 int main()
 3 {
 4     int n;
 5     while(~scanf("%d",&n))
 6     {
 7         int f[2000];
 8         int i;
 9         for(i=0;i<=n-1;i++)
10         scanf("%d",&f[i]);
11         int j;
12         for(i=0;i<=n-2;i++)
13         for(j=i;j<=n-1;j++)
14         {
15             if(f[i]>f[j])
16             {
17                 int t;
18                 t=f[i];
19                 f[i]=f[j];
20                 f[j]=t;
21             }
22         }
23         for(i=0;i<=n-1;i++)
24         if(i!=n-1)printf("%d ",f[i]);
25         else printf("%d\n",f[i]);
26     }
27     return 0;
28 }
View Code

常规思路代码2:(建立排序二叉树,并中序遍历输出)

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 typedef struct node
 4 {
 5     int data;
 6     struct node*l, *r;
 7 } tree, *root;
 8 int k, count;//k和count是全局变量
 9 void middle(root t)
10 {
11     if(t != NULL)
12     {
13         middle(t->l);
14         printf("%d",t->data);
15         if(count > 1)
16         {
17             printf(" ");
18             count--;
19         }
20         middle(t->r);
21     }
22 }
23 root build(root t)
24 {
25     int n, i;
26     root q=t;//q在这里是根节点,起到暂时存储根节点的作用
27     for(i = 1; i <= k-1; i++)//输入剩余的k-1个结点
28     {
29         t=q;//每次都从根节点开始查找
30         scanf("%d",&n);
31         while(1)
32         {
33             if(n < t->data)
34             {
35                 if(t->l == NULL)
36                 {
37                     root p;
38                     p = (root) malloc(sizeof(tree));
39                     p ->l = NULL;
40                     p->r = NULL;
41                     p->data = n;
42                     t->l = p;
43                     break;//break的作用是终止当前循环
44                 }
45                 else
46                     t = t->l;
47             }
48             else
49             {
50                 if(t->r == NULL)
51                 {
52                     root p;
53                     p = (root) malloc(sizeof(tree));
54                     p->data = n;
55                     p->l = NULL;
56                     p->r = NULL;
57                     t->r = p;
58                     break;
59                 }
60                 else
61                     t = t->r;
62             }
63         }
64     }
65     return q;
66 }  
67 int main()
68 {
69     root t;
70     while(~scanf("%d",&k))
71     {
72         count = k;
73         //初始化树
74         t = (root) malloc(sizeof(tree));
75         scanf("%d",&t->data);
76         t->l = NULL;
77         t->r = NULL;
78         t=build(t);//建树
79         middle(t);//中序遍历
80         printf("\n");
81     }
82     return 0;
83 }
View Code

 

posted @ 2013-08-04 11:04  狂盗一枝梅  阅读(685)  评论(0编辑  收藏  举报