一、概述
1、1树的定义及基本术语
树定义:树(tree)是n(n>=0)个节点的有限集。在任意一棵非空树中,(1)有且仅由一个特定的结点称之为根结点(root),(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2...,其中每个集合又是一棵树,称为根结点的子树。
结点的度:结点拥有的子树数称为结点的度,度为0的结点称为叶子结点。树的度是树内各个结点度的最大值。
孩子(child):结点子树的根。例如B称为A的孩子,A称为B的双亲(Parent)。
兄弟:同双亲,例如C是B的兄弟结点。
树的深度:数中结点的最大层次称为树的深度,如图,两棵树的深度均为4。
1、2 二叉树
定义:二叉树是一种特殊的树形结构,其特点是每个结点最多只有两颗子树。
二叉树的性质:
(1)在二叉第i层上之多有2的i-1次方,n>=1。
(2)深度为k的二叉树最大的结点数为2的k次方减1。
(3)叶子结点数为n0,度为2的结点数为n2,则n0=n2+1。
满二叉树:深度为k,并且有2的k次方减1个结点。
完全二叉树:即叶子结点只能出现在最大的两层,与满二叉树为例,它的序号不能错开。
(4)有n个结点的二叉树的深度为log2N向下取整+1。
(5)。。。
1、3二叉树的遍历
先序遍历:(1)访问根结点(2)先序遍历左子树(3)先序遍历右子树。如 -+a*b-cd - /ef
中序遍历:(1)中序遍历左子树(2)访问根结点(3)中序遍历右子树 。如a+b*c-d - e/f
后续遍历:(1)后序遍历左子树(2)后序遍历右子树(3)访问根结点。如abcd-*+ ef/ -
理解:先中后都是根据根结点来思考,子树也是一颗树,也有自己的根结点。不管是先、中、后遍历,都是从左边开始再到右边。
二、叉树的存储结构
2、1顺序存储结构
用一组连续的地址自上而下,自左而右的存储二叉树的结点。可以用一个特定的字符表示不存在的结点。这种存储结构适用于完全二叉树(满二叉树也是完全二叉树),对于其它形式的二叉树浪费存储空间。
2、2链式存储结构
设置不同的结点结构可构成不同形式的链式存储结构。用于表示二叉树的结点,必须包含三个域,为数字域,左指针、右指针。链表的头指针指向二叉树的根结点。存在问题,有n个结点的二叉树,有n+1个空指针域。利用空指针域存储其它信息,从而得到线索二叉树。
三、赫夫曼树(最优二叉树)
如图为带权二叉树,其中c为带权路径最小的树。WPL=1*7+2*5+2*3+3*4=35。
如何构造最优二叉树?
例如:
字母 | a | b | c | d |
权值 | 7 | 5 | 2 | 4 |
每条边的长度算为1,带权路径就是这么计算的 。
最优二叉树的应用——赫夫曼编码
快速远距离通讯的主要手段是电报,即将需要传送的文字转成二进制的字符组成的字符串。在转送报文时,希望总长度尽可能的短。
利用二叉树来设计长度不等的编码,并且任一个字符的编码都不可能是另一个字符编码的前缀,这种编码称为前缀编码。
例如:在要发送‘abcd’这样的一段报文中,各个字符出现的概率为
字符 | a | b | c | d |
概率 | 0.5 | 0.2 | 0.2 | 0.1 |
可以构造成如下的最优二叉树,则有各个字符对应的编码为
a(0) b(10 ) c(111) d:(110) 发送的报文为“010111110”