- 题目描述:
-
输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。
- 输入:
-
输入第一行包括一个整数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
- 提示:
-
输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <string> 5 #define N 109 6 7 struct Node 8 { 9 int key; 10 int left; 11 int right; 12 }; 13 14 int tree[N]; 15 Node treeNode[N]; 16 17 void pre(int gen) { 18 if(gen == -1) { 19 return; 20 } 21 printf("%d ",treeNode[gen].key); 22 pre(treeNode[gen].left); 23 pre(treeNode[gen].right); 24 25 } 26 27 void middle(int gen) { 28 if(gen == -1) { 29 return; 30 } 31 middle(treeNode[gen].left); 32 printf("%d ",treeNode[gen].key); 33 middle(treeNode[gen].right); 34 35 } 36 37 void hou(int gen) { 38 if(gen == -1) { 39 return; 40 } 41 hou(treeNode[gen].left); 42 hou(treeNode[gen].right); 43 printf("%d ",treeNode[gen].key); 44 } 45 int main(int argc, char const *argv[]) 46 { 47 int n; 48 while(scanf("%d",&n) != EOF) { 49 for(int i = 0; i < n; i++) { 50 scanf("%d",&tree[i]); 51 } 52 treeNode[0].key = tree[0]; 53 treeNode[0].left = -1; 54 treeNode[0].right = -1; 55 for(int i = 1; i < n; i++) { 56 treeNode[i].key = tree[i]; 57 treeNode[i].left = -1; 58 treeNode[i].right = -1; 59 int lastTemp = -1; 60 int temp = 0; 61 bool dir = false; 62 bool isEqual = false; 63 while(temp != -1) { 64 if(tree[i] < treeNode[temp].key) { 65 lastTemp = temp; 66 temp = treeNode[temp].left; 67 dir = false; 68 } 69 else if(tree[i] > treeNode[temp].key){ 70 lastTemp = temp; 71 temp = treeNode[temp].right; 72 dir = true; 73 } 74 else { 75 isEqual = true; 76 break; 77 } 78 } 79 if(isEqual) { 80 continue; 81 } 82 if(dir == false) { 83 treeNode[lastTemp].left = i; 84 } 85 else { 86 treeNode[lastTemp].right = i; 87 } 88 89 90 } 91 pre(0); 92 printf(" "); 93 middle(0); 94 printf(" "); 95 hou(0); 96 printf(" "); 97 } 98 return 0; 99 }