实验四 二叉树子系统
1.实验目的
(1)掌握二叉树的特点及其存储方式。
(2)掌握二叉树的创建和显示方法。
(3)复习二叉树遍历的概念,掌握二叉树遍历的基本方法。
2.实验内容
(1)按屏幕提示用前序方法建立一棵二叉树。
(2)编写各个函数:前序遍历、中序遍历、后序遍历、层次遍历、求二叉树的叶子结点数、求二叉树的总结点数、求二叉树的深度。
(3)设计一个选择式菜单,以菜单方式选择下列操作。
二叉树子系统
*******************************************
* 1------建二叉树 *
* 2------凹入显示 *
* 3------先序遍历 *
* 4------中序遍历 *
* 5------后序遍历 *
* 6------层次遍历 *
* 7------求叶子数 *
* 8------求结点数 *
* 9------求树深度 *
* 0------返 回 *
*******************************************
请选择菜单号(0--9):
3.实验步骤
(1)按下图建立二叉树。
(2)输入并调试程序。
(3)验证程序运行结果。
附:程序清单如下:
1 #include<stdio.h> 2 #define TREEMAX 100 3 typedef struct BT 4 { char data; 5 struct BT* lchild; 6 struct BT*rchild; 7 }BT; 8 9 BT *CreateTree(); 10 void ShowTree(BT *T); 11 void Preorder(BT *T); 12 void Postorder(BT *T); 13 void Levelorder(BT *T); 14 void Inorder(BT *T); 15 void Nodenum(BT *T); 16 void Leafnum(BT *T); 17 int TreeDepth(BT *T); 18 int count=0; 19 20 void main() 21 {BT*T=NULL; 22 char ch1,ch2,a; 23 ch1='y'; 24 while(ch1=='y'||ch1=='Y') 25 {printf(" "); 26 printf(" 二叉树子系统"); 27 printf(" *****************************************"); 28 printf(" * 1----建二叉树 *"); 29 printf(" * 2----凹入显示 *"); 30 printf(" * 3----先序遍历 *"); 31 printf(" * 4----中序遍历 *"); 32 printf(" * 5----后序遍历 *"); 33 printf(" * 6----层次遍历 *"); 34 printf(" * 7----求叶子数 *"); 35 printf(" * 8----求结点数 *"); 36 printf(" * 9----求树深度 *"); 37 printf(" * 0----返回 *"); 38 printf(" *****************************************"); 39 printf(" 选择菜单号(0---9):"); 40 41 scanf("%c",&ch2); 42 getchar(); 43 printf(" "); 44 switch(ch2) 45 { case '1': 46 printf(" 请按先序序列输入二叉树的结点: "); 47 printf(" 说明:输入结点('0'表示后继结点为空)后按回车。 "); 48 printf(" 请输入结点:"); 49 T=CreateTree(); 50 printf(" 二叉树成功建立! ");break; 51 case '2': 52 ShowTree(T);break; 53 case '3': 54 printf(" 该二叉树的先序遍历数列为:"); 55 Preorder(T);break; 56 case '4': 57 printf(" 该二叉树的中序遍历数列为:"); 58 Inorder(T);break; 59 case '5': 60 printf(" 该二叉树的后序遍历数列为:"); 61 Postorder(T);break; 62 case '6': 63 printf(" 该二叉树的层次遍历数列为:"); 64 Levelorder(T);break; 65 case '7': 66 count=0;Leafnum(T); 67 printf(" 该二叉树总共有%d个叶子。 ",count);break; 68 case '8': 69 count=0;Nodenum(T); 70 printf(" 该二叉树总共有%d个结点。 ",count);break; 71 case '9': 72 printf(" 该树的高度是:%d",TreeDepth(T));break; 73 case '0': 74 ch1='n';break; 75 default: 76 printf(" *** 请注意:输入有误!***"); 77 } 78 79 if(ch2!='0') 80 { printf(" 按ENTER键继续,按任意键返回主菜单! "); 81 a=getchar(); 82 if(a!='xA') 83 {getchar();ch1='n';} 84 } 85 } 86 } 87 88 89 90 BT *CreateTree() 91 { BT *t; 92 char x; 93 scanf("%c",&x); 94 getchar(); 95 if(x=='0') 96 t=NULL; 97 else 98 {t=(BT*)malloc(sizeof(BT)); 99 t->data=x; 100 printf(" 请输入%c结点的左子结点:",t->data); 101 t->lchild=CreateTree(); 102 printf(" 请输入%c结点的右子结点:",t->data); 103 t->rchild=CreateTree(); 104 } 105 return t; 106 } 107 108 void Preorder(BT *T) 109 { if(T) 110 { printf("%3c",T->data); 111 Preorder(T->lchild); 112 Preorder(T->rchild); 113 } 114 } 115 116 void Inorder(BT *T) 117 { if(T) 118 { 119 Preorder(T->lchild); 120 printf("%3c",T->data); 121 Preorder(T->rchild); 122 } 123 } 124 125 void Postorder(BT *T) 126 { if(T) 127 { 128 Preorder(T->lchild); 129 Preorder(T->rchild); 130 printf("%3c",T->data); 131 } 132 } 133 134 void Levelorder(BT *T) 135 { int i,j; 136 BT *q[100], *p; 137 p=T; 138 if(p!=NULL) 139 {i=1;q[i]=p;j=2;} 140 while(i!=j) 141 {p=q[i];printf("%3c",p->data); 142 if(p->lchild!=NULL) 143 {q[j]=p->lchild;j++;} 144 if(p->rchild!=NULL) 145 {q[j]=p->rchild;j++;} 146 i++; 147 } 148 } 149 150 void Leafnum(BT *T) 151 {if(T) 152 {if(T->lchild==NULL&&T->rchild==NULL) 153 count++; 154 Leafnum(T->lchild); 155 Leafnum(T->rchild); 156 } 157 } 158 159 void Nodenum(BT *T) 160 {if(T) 161 {count++; 162 Nodenum(T->lchild); 163 Nodenum(T->rchild); 164 } 165 } 166 int TreeDepth(BT *T) 167 {int ldep,rdep; 168 if(T==NULL) 169 return 0; 170 else 171 {ldep=TreeDepth(T->lchild); 172 rdep=TreeDepth(T->rchild); 173 if(ldep>rdep) 174 return ldep+1; 175 else 176 return rdep+1; 177 } 178 } 179 void ShowTree(BT *T) 180 {BT *stack[TREEMAX],*p; 181 int level[TREEMAX][2],top,n,i,width=4; 182 if(T!=NULL) 183 {printf(" 凹入表示法: "); 184 top=1; 185 stack[top]=T; 186 level[top][0]=width; 187 while(top>0) 188 {p=stack[top]; 189 n=level[top][0]; 190 for(i=1;i<=n;i++) 191 printf(" "); 192 printf("%c",p->data); 193 for(i=n+1;i<30;i+=2) 194 printf("-"); 195 printf(" "); 196 top--; 197 if(p->rchild!=NULL) 198 {top++; 199 stack[top]=p->rchild; 200 level[top][0]=n+width; 201 level[top][1]=2; 202 } 203 if(p->lchild!=NULL) 204 {top++; 205 stack[top]=p->lchild; 206 level[top][0]=n+width; 207 level[top][1]=1; 208 } 209 } 210 } 211 }
运行过程及结果:
1----建二叉树
2----凹入显示
3----先序遍历
4----中序遍历
5----后序遍历
6----层次遍历
7----求叶子数
8----求结点数
9----求树深度
0----返回