树结构练习——排序二叉树的中序遍历
Time Limit: 1000MS Memory limit: 65536K
题目描述
在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值。现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序遍历的结果。
输入
输入包含多组数据,每组数据格式如下。
第一行包含一个整数n,为关键值的个数,关键值用整数表示。(n<=1000)
第二行包含n个整数,保证每个整数在int范围之内。
输出
为给定的数据建立排序二叉树,并输出其中序遍历结果,每个输出占一行。
示例输入
1 2 2 1 20
示例输出
2 1 20
View Code
1 #include<stdlib.h> 2 #include<stdio.h> 3 typedef struct node 4 { 5 int data; 6 struct node *l, *r; 7 }tree; 8 int n; 9 void build(tree *head, int x) 10 { 11 tree *p; 12 if(head ->data > x) 13 { 14 if(head ->l == NULL) 15 { 16 p = (tree *)malloc(sizeof(tree)); 17 p -> data = x; 18 p -> l = NULL; 19 p -> r = NULL; 20 head -> l = p; 21 } 22 else 23 { 24 build(head->l, x); 25 } 26 } 27 else 28 { 29 if(head -> r == NULL) 30 { 31 p = (tree *)malloc(sizeof(tree)); 32 p -> data = x; 33 p -> l = NULL; 34 p -> r = NULL; 35 head -> r = p; 36 } 37 else 38 { 39 build(head->r, x); 40 } 41 } 42 } 43 void midtravel(tree *head) 44 { 45 if(head) 46 { 47 midtravel(head -> l); 48 if(n > 1) 49 { 50 printf("%d ",head->data); 51 n --; 52 } 53 else printf("%d",head -> data); 54 midtravel(head -> r); 55 } 56 else 57 return; 58 } 59 int main() 60 { 61 int i, a; 62 tree *head; 63 head = (tree *)malloc(sizeof(tree)); 64 while(scanf("%d",&n) != EOF) 65 { 66 for(i = 0; i < n; i ++) 67 { 68 scanf("%d",&a); 69 if(i == 0) 70 { 71 head ->data = a; 72 head ->l = NULL; 73 head ->r = NULL; 74 } 75 else 76 { 77 build(head,a); 78 } 79 } 80 midtravel(head); 81 printf("\n"); 82 } 83 return 0; 84 }