数据结构C语言版(六)二叉树

本文介绍了二叉树的基本概念,包括其定义、特点和类型。重点讲解了二叉树的三种遍历方式:先序遍历、中序遍历和后序遍历。并提出了通过C语言实现二叉树的遍历,以获取叶子节点数量和计算树的深度等操作。
摘要由CSDN通过智能技术生成

1. 二叉树

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分 。

二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点 。

在这里插入图片描述

2.二叉树排序

在这里插入图片描述

先序遍历:先根后左再右,根结点最先输出
中序遍历 :先左后根再右
后序遍历:先左后右再根,根结点最后输出

3.二叉树的代码实现

在这里插入图片描述根据上图中的二叉树编写程序进行遍历,求取叶子结点数,深度等信息的操作。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//定义二叉树的结构体
struct bintreenode
{
	char ch;//结点元素
	bintreenode * rchlid;//左孩子结点
	bintreenode * lchlid;//右孩子结点
};
void Ergodicbintree(struct bintreenode * data)
{
	if (NULL == data)
	{
		return;
	}
	//先序遍历,先根 再左 再右
	//利用函数递归进行树的遍历
	printf("%c\t",data->ch);
	Ergodicbintree(data->lchlid);//遍历左结点树
	Ergodicbintree(data->rchlid);//遍历右结点树
}
void leaf_bintree(bintreenode * data,int * num)
{
	if (NULL == data)
	{
		return;
	}
	//判断是否是叶子结点
	if(data->lchlid == NULL && data->rchlid == NULL)
	{
		* num +=1;  
	}
	//遍历俩个孩子结点
	leaf_bintree(data->lchlid,num);
	leaf_bintree(data->rchlid,num);

}
int highbintree(bintreenode * data)
{if (NULL == data)
	{
		return 0;
	}
	int num = 0;//定义树的深度初始值为0
	int left = highbintree(data->lchlid);//获得左子树高度
	int right = highbintree(data->rchlid);//获得右子树高度
	num = (left>right ? left: right)+1;
	return num;
}
bintreenode * copy_tree(bintreenode * data)
{
	if (NULL == data)
	{
		return NULL;
	}
	//拷贝二叉树
	//获得左结点树
	bintreenode * lchlid = copy_tree(data->lchlid);
	//获得右结点树
	bintreenode * rchild =  copy_tree(data->rchlid);
	//分配新的二叉树的内存空间
	bintreenode * heel = (bintreenode * )malloc(sizeof(bintreenode));
	heel->lchlid = lchlid;//复制左结点
	heel->rchlid = rchild;//复制右结点
	heel->ch = data->ch;//copy结点元素
	return heel;
}
void Destroytree(bintreenode * data)
{
	if (NULL == data)
	{
		return ;
	}
	//销毁二叉树
	Destroytree(data->lchlid);
	Destroytree(data->rchlid);
	printf("被释放的内存为:%c\n",data->ch);
	free(data);
}
void test()
{
	//创建结点
	struct bintreenode  pa={'a',NULL,NULL};
	struct bintreenode  pb={'b',NULL,NULL};
	struct bintreenode  pc={'c',NULL,NULL};
	struct bintreenode  pd={'d',NULL,NULL};
	struct bintreenode  pe={'e',NULL,NULL};
	struct bintreenode  pf={'f',NULL,NULL};
	struct bintreenode  pg={'g',NULL,NULL};
	struct bintreenode  ph={'h',NULL,NULL};
	//创建二叉树,分配左右结点
	pa.lchlid = &pb;
	pa.rchlid = &pf;
	pb.rchlid = &pc;
	pc.lchlid = &pd;
	pc.rchlid = &pe;
	pf.rchlid = &pg;
	pg.lchlid = &ph;
	//遍历
	Ergodicbintree(&pa);
	int num =0;
	leaf_bintree(&pa,&num);//叶子结点个数
	printf("\n树的叶子结点数:%d\n",num);
	int high = highbintree(&pa);
	printf("树的深度:%d\n",high);
	bintreenode * heel = copy_tree(&pa);
	Ergodicbintree(heel);
	//Destroytree(&pa);肯定会报错,因为这不是我们开辟的内存
	Destroytree(heel);//释放开辟的内存
	
}

void main()
{ 
	test();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值