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();
}