#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct BiTNode {
char data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
void CreateBiTree(BiTree *T) {
char ch;
scanf("%c", &ch);
if (ch == '#') {
*T=NULL;
return;
} else {
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = ch;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
return;
}
void PreTraverse(BiTree T) {
if(T) {
printf("%c", T->data);
PreTraverse(T->lchild);
PreTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T) {
if(T) {
InOrderTraverse(T->lchild);
printf("%c", T->data);
InOrderTraverse(T->rchild);
}
}
void LastTraverse(BiTree T) {
if(T) {
LastTraverse(T->lchild);
LastTraverse(T->rchild);
printf("%c", T->data);
}
}
void DestroyBiTree(BiTree *T) {
if(*T == NULL) return;
DestroyBiTree(&((*T)->lchild));
DestroyBiTree(&((*T)->rchild));
free(*T);
*T = NULL;
}
int NodeCount(BiTree T) {
if(T==NULL) return 0;
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
int Depth(BiTree T) {
if(T==NULL) return 0;
else {
int m=Depth(T->lchild);
int n=Depth(T->rchild);
return m>n?m+1:n+1;
}
}
void countDegree(BiTree T,int* count0,int* count1,int* count2) {
if(T==NULL)return;
if(T->lchild==NULL&&T->rchild==NULL) {
(*count0)++;
} else if(T->lchild!=NULL&&T->rchild!=NULL) {
(*count2)++;
} else {
(*count1)++;
}
countDegree(T->lchild,count0,count1,count2);
countDegree(T->rchild,count0,count1,count2);
}
int main() {
printf("----------命令菜单----------\n");
printf("\t1. 建立二叉树\n");
printf("\t2. 先序遍历\n");
printf("\t3. 中序遍历\n");
printf("\t4. 后序遍历\n");
printf("\t5. 销毁二叉树\n");
printf("\t6. 统计二叉树的深度和总结点数\n");
printf("\t7. 统计二叉树不同度的结点个数\n");
printf("\t8. 退出\n");
printf("----------------------------\n");
BiTree T;
int number,count = 0;
bool flag=true;
int count0=0,count1=0,count2=0;
while(flag) {
printf("\n请输入想要进行的操作:");
scanf("%d", &number);
rewind(stdin);
switch(number) {
case 1:
printf("请输入要建立的二叉树中的元素,#代表空树\n");
CreateBiTree(&T);
printf("二叉树建立成功!\n");
break;
case 2:
printf("先序遍历:");
PreTraverse(T);
break;
case 3:
printf("\n中序遍历:");
InOrderTraverse(T);
break;
case 4:
printf("\n后序遍历:");
LastTraverse(T);
break;
case 5:
DestroyBiTree(&T);
printf("二叉树销毁成功!\n");
break;
case 6:
printf("总结点数为:%d\n",NodeCount(T));
printf("二叉树的深度为:%d\n",Depth(T));
break;
case 7:
count0=0;
count1=0;
count2=0;
countDegree(T,&count0,&count1,&count2);
printf("度为0的结点数目为:%d\n",count0);
printf("度为1的结点数目为:%d\n",count1);
printf("度为2的结点数目为:%d\n",count2);
break;
case 8:
flag=false;
printf("已成功退出程序!");
break;
default:
break;
}
}
return 0;
}
需要注意的是在while循环中,我们从键盘录入的数据会影响后续二叉树的建立。解决方案是在用户输入后,清除缓冲区
rewind(stdin);