由顺序方式存储的完全二叉树进行重建 (c++)
实验题目(共6题, 第3题)
标题: | 由顺序方式存储的完全二叉树进行重建 |
时 限: | 1000 ms |
内存限制: | 3000 K |
总时限: | 3000 ms |
描述: | 按顺序方式存储的一棵完全二叉树的结点记录,结点个数为n。根据所输入的顺序结构的结点记录建立二叉树,输出树的先序,中序和后序遍历结果。 注:数字“0”表示不存在此结点,没有孩子结点 |
输入: | 树结点个数n 顺序方式存储的完全二叉树 |
输出: | 先序遍历输出 中序遍历输出 后序遍历输出 |
输入样例: | 10 1 2 0 3 4 0 0 5 6 7 |
输出样例: |
1 2 3 5 6 4 7
5 3 6 2 7 4 1
5 6 3 7 4 2 1
|
提示: | 数字“0”的孩子结点全部为“0” |
来源: |
View Code
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<malloc.h>
4
5 typedef int ElemType;
6 typedef struct TNode
7 {
8 ElemType data;
9 struct TNode* lChild;
10 struct TNode* rChild;
11 }TNode,*BiTree;
12
13 ElemType* Get(int);
14 BiTree Creat_BiTree(ElemType *,int,int);
15 void PreOrderTraverse(BiTree);
16 void InOrderTraverse(BiTree);
17 void PostOrderTraverse(BiTree);
18 void DestroyTree(BiTree);
19
20 int main(void)
21 {
22 int n;
23 //int i;
24 ElemType *a;
25 BiTree T;
26
27 scanf("%d",&n);
28 a=Get(n);
29 //for(i=0;i<n;i++)
30 // printf("%d\n",a[i]);
31 T=Creat_BiTree(a,0,n);
32 PreOrderTraverse(T);
33 printf("\n");
34 InOrderTraverse(T);
35 printf("\n");
36 PostOrderTraverse(T);
37 printf("\n");
38 DestroyTree(T);
39 free(a);
40
41 return 0;
42 }
43
44 ElemType* Get(int n)
45 {
46 int i;
47 ElemType *a;
48 a=(ElemType*)malloc(sizeof(ElemType)*n);
49 if(!a)
50 {
51 printf("out of space!\n");
52 exit(0);
53 }
54 for(i=0;i<n;i++)
55 scanf("%d",&a[i]);
56
57 return a;
58 }
59
60 BiTree Creat_BiTree(ElemType *a,int i,int n)
61 {
62 //int i;
63 BiTree tmpcell;
64 if(*a==0||i>n-1)
65 return NULL;
66 /*else if(2*i+1>n-1)
67 {
68 tmpcell=(BiTree)malloc(sizeof(TNode));
69 tmpcell->data=*a;
70 tmpcell
71 }*/
72 else
73 {
74 tmpcell=(BiTree)malloc(sizeof(TNode));
75 tmpcell->data=*a;
76 tmpcell->lChild=Creat_BiTree(a+i+1,2*i+1,n);
77 tmpcell->rChild=Creat_BiTree(a+i+2,2*i+2,n);
78 }
79
80 return tmpcell;
81 }
82
83 void PreOrderTraverse(BiTree T)
84 {
85 if(T!=NULL)
86 {
87 printf("%d ",T->data);
88 PreOrderTraverse(T->lChild);
89 PreOrderTraverse(T->rChild);
90 }
91 }
92
93 void InOrderTraverse(BiTree T)
94 {
95 if(T!=NULL)
96 {
97 InOrderTraverse(T->lChild);
98 printf("%d ",T->data);
99 InOrderTraverse(T->rChild);
100 }
101 }
102
103 void PostOrderTraverse(BiTree T)
104 {
105 if(T!=NULL)
106 {
107 PostOrderTraverse(T->lChild);
108 PostOrderTraverse(T->rChild);
109 printf("%d ",T->data);
110 }
111 }
112
113 void DestroyTree(BiTree T)
114 {
115 if(T!=NULL)
116 {
117 DestroyTree(T->lChild);
118 DestroyTree(T->rChild);
119 free(T);
120 }
121 }