学习数据结构:二叉树

风格不统一 提交于 2020-02-05 09:30:54

二叉树的定义
二叉树,是树的一种特殊结构。其特点是:
①每个结点最多有两棵子树,不存在度大于2的结点。
②左子树和右子树是由次序的,不能颠倒。

特殊二叉树
1、斜树
所有结点都只有左子树的二叉树叫左斜树,同理结点只有右子树的叫右斜树。每一次只有一个结点,结点的个数与二叉树的深度相同。下面两个结构分别为左斜树和右斜树。
在这里插入图片描述
在这里插入图片描述
2、满二叉树
在一棵二叉树中,如果所有的分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层,这样的二叉树称为满二叉树。
结合定义可得到三个结论:
①叶子结点出现在同一层。
②非叶子结点的度一定是2.
③同样深度的二叉树中,满二叉树的结点数最多,叶子结点树最多。
如下图所示为一颗满二叉树。
在这里插入图片描述
完全二叉树
对一棵有n个结点的二叉树按序号从小到大开始排序,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点位置完全相同,则这棵二叉树称为完全二叉树。通俗的话说,就是这棵二叉树中间没有空缺。下图就是一颗完全二叉树。在这里插入图片描述
下面的树就不是一颗完全二叉树,
在这里插入图片描述
结合定义可以得出结论:
①叶子结点只能出现在最下面两层。
②最下的叶子一定集中在左部的连续位置,中间不能有空挡。
③倒数第二层有叶子结点,那么一定在右边连续位置。
④如果结点度为1,则该结点只有左孩子,不会存在右子树。

二叉树的性质

性质①在二叉树的第i层上最多只有2^(i-1)个结点(i>=1)。
第一层根结点,只有一个,2^0=1
第二层有2个,2^1=2
第三层有4个,2^2=4
……

性质②深度为k的二叉树最多只有2^k-1个结点。
深度为k的二叉树,就是有k层的二叉树。
如果有1层,最多有2^1-1=1个结点
如果有2层,最多有2^2-1=3个结点
如果有3层,最多有2^3-1=7个结点
……

性质③任何一颗二叉树,如果终端结点树为n0,度为2的结点树为n2,则n0=n2+1。
在这里插入图片描述
以上面的二叉树为例,
每一个结点有一根连接线,但是根节点没有连接线,所以分支总线为结点总数减1,一个结点的度是多少则分线就有多少。
用n表示总结点树,n1表示度为1的结点,n2表示度为2的结点。那么根据分支线算法, n-1=n1+2n2,同时n=n0+n1+n2,根据这两个式子可推导出n0=n2+1.

性质④具有n个结点的完全二叉树的深度为|log2n +1|(取整)

根据性质2可知,深度为k的满二叉树的结点数一定为2^k-1。可以倒推出,满二叉树的深度为k=log2(n+1)。
根据完全二叉树的定义可知,一棵完全二叉树的结点数一定少于等于同样深度满二叉树的结点数 2^k-1,但一定多于 2^(k-1)-1,即满足 2^(k-1)-1<n≤ 2^k-1.

性质⑤对一颗有n个结点的完全二叉树,其结点按次序开始编号,则对任一结点i有:
1.i=1,则该结点i是二叉树的跟结点,无双亲;
2.如果2i>n,则结点i无左孩子,否则其左孩子是结点2i;
3.如果2i+1>n,则该结点i无右孩子,否则右孩子是结点2i+1;
在这里插入图片描述
二叉树的存储结构

链式存储,二叉树每个结点最多有2个孩子,可以设计结点有一个数据域和两个指针域,这样的链表称为二叉链表
在这里插入图片描述
对于二叉链表结点结构体的定义

typedef struct BiTNode
{
	TELemType data;//结点数据
	//左右孩子指针
	struct BiTNode *Lchild,*Rchild;
}BiTNode,*BiTree;

具体结构示意图:
在这里插入图片描述
当然可以再增加一个指针域,存放双亲结点的位置,这种结构称为三叉链表,与二叉链表大同小异。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!