线性结构的数据元素是一对一的关系。
非线性结构:树形结构和图状结构。
树形结构是一对多的非线性结构,数据元素之间既有分支关系,又有层次关系。
树形结构由树和二叉树两种,树的操作实现比较复杂,但树可以转换为二叉树进行处理。
5.1树
5.1.1树的定义
树(Tree)是n个相同类型的数据元素的有限集合。树中的数据元素叫结点(Node)。
记为T,T=(D,R):D是结点的有限集合;R是结点之间关系的有限集合。
除根节点外的所有结点有且只有一个前驱节点,如果结点之间形成了环(前驱节点有两个),那么就不是树了。
5.1.2树的相关术语
2、结点的度(Degree of Node):结点所拥有的子树的个数。
3、树的度(Degree of Tree):树中各结点度的最大值。
4、叶子结点(Leaf Node):度不为0的结点,也叫终端结点。
5、分支结点(Branch Node):度不为零的结点,也叫非终端结点或内部节点。
8、祖先(Ancestor):从根到该节点所经分支上的所有结点。
9、结点的层数:就是第几层。
12、堂兄弟(Sibling):同一层的双亲不同的结点。
13、树的深度(Depth of Tree):就是有多少层。
14、无序树(Unordered Tree):树中任意一个结点的各孩子结点之间的次序构成无关紧要的树。
15、有序树(Ordered Tree):树中任意一个结点的各孩子结点有严格排序次序的树。二叉树是有序树,因为二叉树中每个孩子结点都确切定义为是该结点的左孩子结点还是右孩子结点。
16、森林(Forest):m(m>=0)棵树的集合。5.2二叉树
5.2.1二叉树的定义
二叉树(Binary Tree)是n个相同类型的结点的有限集合。(若n>1,则除根结点外,其余结点被分成了2个互不相交的集合T1、T2,而T1、T2本身又是一棵二叉树,分别称为这棵二叉树的左子树(Left Subtree),和右子树(Right Subtree),左子树和右子树颠倒则成为另一棵不同的二叉树)。
记为BT,BT=(D,R):D是结点的有限集合;R是结点之间关系的有限集合。
(1)满二叉树(Full Binary Tree):一颗二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上。
对于深度为K的满二叉树的结点个数为(2^k)-1。
(2)完全二叉树(Complete Binary Tree):深度为K,有N个结点的二叉树当且仅当其每一个结点都域深度为k,有N个结点的满二叉树中编号从1:N的结点意义对应是,称为完全二叉树(完全二叉树是满二叉树的子集)。
性质:对于一棵非空二叉树,度为0的结点数目为N0,度为2的结点数目为N2,则有N0=N2+1。
5.2.5二叉树的遍历
遍历时将二叉树中的结点信息由非线性排列变为某种意义上的线性排列(遍历操作使非线性结构线性化)。
规定D、L、R分别代表遍历根结点、遍历左子树、遍历右子树,则二叉树的遍历方式有6种:DLR、DRL、LDR、LRD、RDL、RLD。由于先遍历左子树和先遍历右子树在算法设计上没有本质区别,所以只讨论三种方式:DLR(先序遍历)、LDR(中序遍历)和LRD(后序遍历),命名是按照根结点被访问的次序。
除了上面三种方法,还有层序遍历(Level Order):从根结点开始,按照从上到下、从左到右的顺序依次访问每个结点一次仅一次。如下图:A B C D E F G H I J
1、先序遍历(DLR)
思想:首先访问根结点,然后先序遍历其左子树,最后先序遍历其右子树。如上图:A B D H I E J C F G
2、中序遍历(LDR)
思想:首先中序遍历根结点的左子树,然后访问根结点,最后中序遍历其右子树。如上图:H D I B J E A F C G
3、后序遍历(LRD)
思想:首先后序遍历根结点的左子树,然后后序遍历根结点的右子树,最后访问根结点。如上图:H I D J E B F G C A
5.3树与森林
5.3.3树和森林的遍历
1、树的遍历
(1)先序遍历,即先访问树的根结点,然后依次遍历树中的每棵子树。如上图:A B E F G C H D I J
(2)后序遍历,即先依次后序遍历树中的每棵子树,然后访问根结点。如上图:E F G B H C I J D A
2、森林的遍历
(1)先序遍历,即先访问森林中第一棵树的根结点,然后先序遍历第一棵树中的每棵子树,最后先序遍历除第一棵树之后剩余的子树森林。如下图:A B C D E F G H J I
(2)中序遍历,即先中序遍历森林中第一棵树的根结点的所有子树,然后访问第一棵树的根结点,最后中序遍历除第一棵树之后剩余的子树森林。如下图:B C D A F E J H I G
森林的前序遍历和中序遍历与所转换得到的二叉树的先序遍历和中序遍历的结果序列相同。
5.4哈夫曼树
5.4.1哈夫曼树的基本概念
(1)路径(Path):从树中的一个结点到另一个结点之间的分支构成这两个结点间的路径。
(2)路径长度(Path Length):路径上的分支数。
(3)树的路径长度(Path Length of Tree):从树的根结点到每个结点的路径长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。
(4)结点的权(Weight of Node):赋予树中结点的一个有实际意义的数。
(5)结点的带权路径长度(Weight Path Length of Node):从该结点到树的根结点的路径长度与该结点的权的乘积。
(6)树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和。
哈夫曼树(Huffman Tree),又叫最优二叉树,值的是对于一组具有确定权值的叶子结点的具有最小带权路径长度的二叉树。
一棵有n个叶子结点构造的哈夫曼树共有2*n-1个结点。
5.4.3哈夫曼编码
规定哈夫曼树中的左分支代表0,右分支代表1,则从根结点到叶子结点所经过的路径分支组成0和1的序列便为该结点对应字符的编码就是哈夫曼编码(Huffman Encoding)。
在建立不等长编码中,必须使任何一个字符的编码都不是另一个编码的前缀,这样才能保证译码的唯一性。