1、6.4 线索二叉树,6.4.1 线索二叉树定义 前驱与后继:在二叉树的先序、中序或后序遍历序列中两个相邻的结点互称为 线索:指向前驱或后继结点的指针称为 线索二叉树:加上线索的二叉链表表示的二叉树叫 线索化:对二叉树按某种遍历次序使其变为线索二叉树的过程叫 在有n个结点的二叉链表中必定有n+1个空链域 在线索二叉树的结点中增加两个标志域 ltag :若 ltag =0, left域指向左孩子;若 ltag=1, left域指向其前驱 rtag :若 rtag =0, right域指向右孩子;若 rtag=1, right域指向其后继 结点定义:,0,0,0,0,1,1,1,1,1,1,0,0,
2、0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,6.4.2 中序线索二叉树,二叉树的中序线索化 中序线索二叉树类 中根次序遍历中序线索二叉树 【例6.4】 构造中序线索二叉树并进行中根次序遍历。,6.5 哈夫曼编码与哈夫曼树,6.5.1 哈夫曼编码 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的 路径长度:路径上的分支数 树的路径长度:从树根到每一个结点的路径长度之和 树的带权路径长度:树中所有带权结点的路径长度之和 二叉树的带权外路径长度,哈夫曼树定义为带权外路径长度最短的二叉树。 哈夫曼树不唯一,构造哈夫曼树,1、根据给定的n个权值w1,w2,wn构成
3、n棵二叉树的集合F=T1,T2,Tn,其中每棵二叉树Ti中都有一个权值为wi的根结点,其左右子树均空。 2、在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。 3、在F中删除这两棵树,同时将新得到的二叉树加入F中。 4、重复2和3,直到F只含一棵树为止。这棵树便是哈夫曼树。,例 w=5, 29, 7, 8, 14, 23, 3, 11,哈夫曼编码,所谓编码是指将文件中的每个字符均转换为一个惟一的二进制位串,而解码则相反,是将二进制位串转换为对应的字符 。 例:假设待压缩的数据文件中共有100000个字符,这些字符均取
4、自字符集C=a,b,c,d,e,f,其中每个字符在文件中出现的次数(简称频度)如表所示。,定长编码:300000位 变长编码:(451+133+123+163+94+54)1000=224000 位 思考:变长编码的特点。,Huffman编码:数据通信用的二进制编码 思想:根据字符出现频率编码,使电文总长最短 编码:根据字符出现频率构造Huffman树,然后将树中结点引向其左孩子的分支标“0”,引向其右孩子的分支标“1”;每个字符的编码即为从根到每个叶子的路径上得到的0、1序列,例 要传输的字符集 D=C,A,S,T, ; 字符出现频率 w=2,4,2,3,3,T : 00 ; : 01 A
5、: 10 C : 110 S : 111,译码:从Huffman树根开始,从待译码电文中逐位取码。若编码是“0”,则向左走;若编码是“1”,则向右走,一旦到达叶子结点,则译出一个字符;再重新从根出发,直到电文结束,例 电文是CAS;CAT;SAT;AT其编码 “11010111011101000011111000011000”电文为“1101000”译文只能是“CAT”,Huffman树应用 最佳判定树,6.6 树的表示,6.6.1 树的存储结构,孩子链表 孩子兄弟链表,6.6.2 树的遍历,树的先根遍历算法描述如下: 访问根结点。 按照从左到右的次序先根遍历根的每一棵子树。 树的后根遍历算法描述如下: 按照从左到右的次序后根遍历根的每一棵子树。 访问根结点。,先序遍历:,后序遍历:,A,B,E,F,I,G,C,D,H,J,K,L,N,O,M,E,I,F,G,B,C,J,K,N,O,L,M,H,D,A,