#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);// 清除缓冲区,防止影响后面的数据操作