由顺序方式存储的完全二叉树进行重建 (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”
来源:

《由顺序方式存储的完全二叉树进行重建 (c++)》
《由顺序方式存储的完全二叉树进行重建 (c++)》
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 }
    原文作者:itbird
    原文地址: https://www.cnblogs.com/xiaofengkang/archive/2011/05/24/2055792.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞