1、本质问题——
树不是线性表,是一种描述非线性层次关系的数据结构。描述的是一对多的数据结构。
2、基本特征——
3、基本概念——
4、树的存储结构——
注:第一种方法与第二种方法合并组合成双亲孩子表示法。
第三种方法最大的好处就是把一颗复杂的树变成一颗二叉树。可以充分利用二叉树的特性与算法来处理这颗树。
5、树的种类——
6、二叉树——
左子树和右子树是有顺序的,次序不能任意颠倒。
7、二叉树的性质——
性质1:在二叉树的第i层上至多有2i-1个节点(i >= 1)
性质2:深度为k的二叉树至多有2k-1个节点(k >=1)
性质3:对于任意一棵二叉树T而言,其叶子节点数目为N0,度为2的节点数目为N2,则有N0 = N2 + 1。
性质4:具有n个节点的完全二叉树的深度(log2n)+1(括号内的值取下限)。
性质5:一棵完全二叉树,其深度为,节点编号按层编号,每层从左至右编号,则对任意节点i(1<= i <= n)
(1) 如果i = 1,则该点为根节点,无双亲,否则其双亲为(i/2)(括号内的值取下限);
(2) 如果2i>0,则该点无左孩子(节点为叶子节点),否则其左孩子为2i;
(3) 如果2i+1,则该点无右孩子,否则其左孩子为2i+1;
8、存储方式——
二叉树的顺序存储结构用一维数组存储二叉树中的结点,并且结点的存储位置,也就是数组的下标要体现出结点之间的逻辑关系。
就是从根结点开始一层层地按顺序存储在数组里,但是只适用于完全二叉树,因为非完全二叉树的话,可能会浪费大量的存储空间。
因为二叉树最多有两个孩子,所以二叉链表拥有一个数据域和两个指针域。
如果有需要还可以再增加一个指向其双亲的指针域,那就称为三叉链表。
9、二叉树的遍历——
10、树、森林与二叉树的转换——
注:面对复杂的树与森林都可以转换成简单二叉树来进行处理,由于二叉树至多只有两个节点,变化较少,很多性质与算法被研究出来,使用方便。
11、查找二叉树(排序二叉树)
(图a)
二叉查找树是一种动态查找表(图a),具有这些性质:
(1)若它的左子树不为空,则左子树上的所有节点的值都小于它的根节点的值;
(2)若它的右子树不为空,则右子树上所有节点的值都大于它的根节点的值;
(3)其他的左右子树也分别为二叉查找树;
(4)二叉查找树是动态查找表,在查找的过程中可见添加和删除相应的元素,在这些操作中需要保持二叉查找树的以上性质。
12、平衡二叉树(AVL树)
(图b)
含有相同节点的二叉查找树可以有不同的形态,而二叉查找树的平均查找长度与树的深度有关,所以需要找出一个查找平均长度最小的一棵,那就是平衡二叉树(图b),具有以下性质:
(1)要么是棵空树,要么其根节点左右子树的深度之差的绝对值不超过1;
(2)其左右子树也都是平衡二叉树;
(3)二叉树节点的平衡因子定义为该节点的左子树的深度减去右子树的深度。则平衡二叉树的所有节点的平衡因子只可能是-1,0,1。
13、红黑树树
(图c)
红黑树是一种自平衡二叉树,在平衡二叉树的基础上每个节点又增加了一个颜色的属性,节点的颜色只能是红色或黑色。具有以下性质:
(1)根节点只能是黑色;
(2)红黑树中所有的叶子节点后面再接上左右两个空节点,这样可以保持算法的一致性,而且所有的空节点都是黑色;
(3)其他的节点要么是红色,要么是黑色,红色节点的父节点和左右孩子节点都是黑色,及黑红相间;
(4)在任何一棵子树中,从根节点向下走到空节点的路径上所经过的黑节点的数目相同,从而保证了是一个平衡二叉树。
14、线索二叉树
二叉链表有很多浪费的空指针可以利用,线索二叉树给二叉树的查找与遍历带来了高效率。
指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树就称为线索二叉树。
对二叉树以某种次序遍历使其变为线索二叉树的过程称为线索化。
二叉链表充分利用了空指针域的空间,又保证了创建过程时的一次遍历就可以终生享用的前驱后继的信息。因此,如果所用的二叉树需经常遍历或查找结点时需要某种遍历序列中的前驱后继,那么采用线索二叉树的存储结构是非常不错的选择。
15、哈弗曼树(最优二叉树)
从树中的一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径长度。
树的路径长度就是从树的根结点到每一结点长度之和。
带权路径长度最小的二叉树称为哈夫曼树。
构建哈夫曼树的步骤(四步)。
哈夫曼树的应用:哈弗曼编码
一般地,设需要编码的字符集为{d1,d2,...,dn},各个字符在电文中出现的次数或频率集合为{w1,w2,...,wn},以d1,d2,...,dn作为叶子结点,以w1,w2,...,wn作为相应的叶子结点的权值来构建一颗哈夫曼树。规定哈夫曼树的左分支代表0,右分支代表1,则从根结点到叶子结点所经过的分支组成0和1的序列便为该节点对应字符的编码,这就是哈弗曼编码。