#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; // 将指针置为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后,只使用67,68行无错误
//CreateBiTree(&T);
//PreTraverse(T);
//printf("总结点数为:%d\n",NodeCount(T));
//printf("二叉树的深度为:%d\n",Depth(T));
// countDegree(T,&count0,&count1,&count2);
// printf("%d,%d,%d",count0,count1,count2);
// 注释掉67,68行,只使用while出现bug,不能成功创建二叉树
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);// 清除缓冲区,防止影响后面的数据操作