二叉树的基本操作

#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);// 清除缓冲区,防止影响后面的数据操作 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
二叉树是一种非常重要的数据结构,它的基本操作包括创建、销毁、遍历、查找等。下面是二叉树基本操作的实现方法: 1. 创建二叉树:通过前序遍历的数组构建二叉树,其中 '#' 表示空节点。具体实现方法可以参考引用中的 BinaryTreeCreate 函数。 2. 销毁二叉树:遍历二叉树,依次释放每个节点的内存空间。具体实现方法可以参考引用中的 BinaryTreeDestory 函数。 3. 遍历二叉树二叉树的遍历包括前序遍历、中序遍历、后序遍历和层序遍历。具体实现方法可以参考引用中的 BinaryTreePrevOrder、BinaryTreeInOrder、BinaryTreePostOrder 和 BinaryTreeLevelOrder 函数。 4. 查找二叉树节点:在二叉树中查找值为 x 的节点,具体实现方法可以参考引用中的 BinaryTreeFind 函数。 5. 计算二叉树节点个数:计算二叉树中节点的个数,具体实现方法可以参考引用[2]中的 BinaryTreeSize 函数。 6. 计算二叉树叶子节点个数:计算二叉树中叶子节点的个数,具体实现方法可以参考引用中的 BinaryTreeLeafSize 函数。 7. 计算二叉树第 k 层节点个数:计算二叉树中第 k 层节点的个数,具体实现方法可以参考引用中的 BinaryTreeLevelKSize 函数。 8. 判断二叉树是否是完全二叉树:判断二叉树是否是完全二叉树,具体实现方法可以参考引用中的 BinaryTreeComplete 函数。 9. 计算二叉树的深度:计算二叉树的深度,具体实现方法可以参考引用中的 BinaryTreeDeep 函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥也不会写呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值