二叉树的基本操作实现

本文详细介绍了二叉树的基本操作,包括插入节点、删除节点、遍历(前序、中序、后序)等核心算法。通过实例解析,帮助读者深入理解二叉树的原理及其在计算机科学中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


<span style="font-size:18px;"><span style="font-size:18px;">#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define PF printf("\n")
int m,n,max; 
typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;//定义二叉树

//创建二叉树 (按照前序顺序输入) 
void CreateBiTree(BiTree &T)
{  
	int temp;
	scanf("%d",&temp);
	if(temp==-1)
		T=NULL;
	else
	{
		T=new BiTNode;
		T->data=temp;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild); 
	} 
} 

//二叉树遍历,先序遍历
void PreOrderTraverse(BiTree &T)
{ 
	if(T)
	{
		printf("%d ",T->data); 
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild); 
	} 
} 

//二叉树中序遍历
void InOrderTraverse(BiTree &T)
{
	if(T)
	{
		InOrderTraverse(T->lchild);
		printf("%d ",T->data);
		InOrderTraverse(T->rchild);
	} 
}

//二叉树后序遍历
void PosOrderTraverse(BiTree &T)
{  
	if(T)
	{
		PosOrderTraverse(T->lchild);
		PosOrderTraverse(T->rchild);
		printf("%d ",T->data);
	} 
}

//计算结点的个数
int NodeCount(BiTree T)
{
	if(T==NULL)
		return 0;
	else
		return NodeCount(T->lchild)+NodeCount(T->rchild)+1;	 
}

//计算叶子节点的个数
int CountLeaves(BiTree T)
{
	if(T==NULL)
		return 0;
	if(T->lchild==NULL&&T->rchild==NULL)
		return 1;
	else
		return CountLeaves(T->lchild)+CountLeaves(T->rchild); 
}
int Depth(BiTree T)
{
	if(T==NULL)
		return 0;
	m=1,n=1;
	m+=Depth(T->lchild);
	n+=Depth(T->rchild);
	if(m>n)
		return m;
	else
		return n;  
}

//交换左右子树 
BiTree Exchange(BiTree &T)
{
	BiTree p;
	if(T==NULL||(T->lchild==NULL&&T->rchild==NULL))
		return T;
	p=T->lchild;
	T->lchild=T->rchild;
	T->rchild=p;
	if(T->lchild)
		T->lchild=Exchange(T->lchild);
	if(T->rchild)
		T->rchild=Exchange(T->rchild);
	return T; 
} 
int main()
{
	BiTree T;
	T=NULL;
	while(1)
	{
		PF;PF;PF;
		printf("\t\t1、按照前序顺序的方式输入\n");
		printf("\t\t2、按照前序遍历方式遍历\n");
		printf("\t\t3、按照中序遍历方式遍历\n");
		printf("\t\t4、按照后序遍历方式遍历\n");
		printf("\t\t5、计算结点的个数\n");
		printf("\t\t6、计算叶子节点的个数\n");
		printf("\t\t7、计算二叉树的深度\n");
		printf("\t\t8、左右子树交换\n"); 
		printf("\t\t9、退出程序\n");
		PF;PF;
		printf("\t请选择:");
		int n,sum=0;
		scanf("%d",&n); 
		switch(n)
		{
			case 1:system("cls");PF;PF;
			printf("请按照先序的顺序输入不同的整数(-1代表为空):");
			CreateBiTree(T);getchar();break;
			case 2:system("cls");PF;
			printf("前序输出的顺序为:");
			PreOrderTraverse(T);break;
			case 3:system("cls");PF;
			printf("中序输出的顺序为:");
			InOrderTraverse(T);break;
			case 4:system("cls");PF;
			printf("后序输出的顺序为:");
			PosOrderTraverse(T);break;
			case 5:system("cls");sum=NodeCount(T);
			printf("结点的个数为:"); 
			printf("%d\n",sum);break;
			case 6:system("cls");sum=CountLeaves(T);
			printf("叶子结点的个数为:"); 
			printf("%d\n",sum);break;
			case 7:system("cls");
			printf("二叉树的深度为:"); 
			max=Depth(T);
			printf("%d\n",max);break;
			case 8:system("cls");Exchange(T);
			printf("交换成功!!\n\n");
			break; 
			case 9:exit(0); 
		} 
	}
	return 0; 
} 
//1 2 4 8 -1 -1 9 -1 -1 5 -1 10 -1 -1 3 6 -1 11 -1 -1 7 -1 -1
 </span></span>


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值