树与二叉树(c/c++)

  • 树的特点:

结点的度:该结点拥有非空子树的个数。树的度:所有结点的度的最大值。层次:第一层为树的根结点所在层,第二层为根的儿子所在层...。树的高度(深度):树的最大层次。结点的高度:从最深的叶子结点往上数起。结点的深度:从根结点数起

  • 二叉树:

二叉树是递归定义的,其结点有左右孩子之分。

二叉树有顺序存储和链式存储两种存储结构,其中链式存储最为常用,顺序存储结构适合用于完全二叉树的存储,将结点存储在数组中,根据下面树的性质4通过数组下标进行访问,又如之前的堆排序中采用的就是完全二叉树的顺序存储结构。

二叉树的五种形态:1,空二叉树  2,只有一个根结点的二叉树  3,只有左子树的二叉树   4   只有右子树的二叉树    5  完全二叉树

二叉树链式存储结点定义如下:

typedef struct btNode 
{
	char data;//结点中的信息
	struct btNode* lc;//左孩子结点
	struct btNode* rc;//右孩子结点
}btNode;
  • 树的性质:

1,总结点数=总分支数+1。可推在二叉树中,n0+n1+n2=2*n2+n1+1   得:n0=n2+1

2,n个结点的树含有2n个指针,其中非空指针数位n-1,空指针数位n+1

3,二叉树中第i层最多有2^(k-1)个结点,高(深)度为k的二叉树中最多有2^k-1个结点

4,n个结点的完全二叉树中,按从上至下,从左到右对数编号,根结点编号为1,则对于编号为i的结点:若i不等于1,那其双亲编号为i/2(向下取整);若2*i小于等于n,那其左孩子编号为2i;若2*i+1小于等于n,那其右孩子编号为2i+1。根结点编号为0的话:若i不等于0,那其双亲结点为i/2-1(向上取整);在其左右孩子存在的条件下,左孩子为2i+1,右孩子为2i+2

5,n个结点可以构成h(n)种不同的二叉树,h(n)=C(2n,n)/(n+1),h(n)为卡特兰数

6,n个结点完全二叉树的高度为logn+1(logn向下取整)或log(n+1)(向上取整)

  • 树的三种存储结构:

1,双亲表示法(树编号从1开始,根结点的双亲结点(父结点)为-1)

typedef struct  
{
	char data;//结点中的信息
	int parent;//父结点
}node;

2,孩子表示法(类似于图的邻接表表示法)

此处无代码,无图,读者可自行想象。(有点懒...)

3,孩子兄弟表示法(用于树与二叉树的转换,口诀为左孩子,右兄弟)

typedef struct node 
{
	char data;//结点中的信息
	struct node* son;//孩子结点
	struct node* brother;//孩子的兄弟结点
}node;

树的先序遍历等同于其转换二叉树的先序遍历;树的后序遍历等同于其转换二叉树的中序遍历。森林的先序遍历等同于其转换二叉树的先序遍历;树的中序遍历等同于其转换二叉树的中序遍历。

 

 

 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值