C语言打印以二叉树存储的树,数据结构——使用C语言树和二叉树.ppt

数据结构——使用C语言树和二叉树

数据结构——使用C语言树和二叉树 T=(D,R) DF = D1∪D2∪…∪Dm (1≤i,j≤m, Di∩Dj=¢) R={, i=1,2,…,n-1} 4.树的存储结构 树的结点之间的逻辑关系主要有双亲-孩子关系,兄弟关系。因此,从结点之间的逻辑关系分,树的存储结构主要有:双亲表示法、孩子表示法、双亲孩子表示法和孩子兄弟表示法四种组合。 指针有常规指针和仿真指针 1.二叉树的定义 2.二叉树抽象数据类型 3.二叉树的性质 3二叉树的设计和实现 3.1二叉树的存储结构 二叉树的存储结构主要有三种:顺序存储结构、链式存储结构和仿真指针存储结构。 1. 二叉树的顺序存储结构 完全二叉树的结点可按从上至下和从左至右的次序存储在一维数组中,其结点之间的关系可由公式计算得到,这就是二叉树的顺序存储结构。下面两棵树在数组中的存储结构分别为: 一旦建立了某种方式的线索二叉树后,用户程序就可以像操作双向链表一样操作该线索二叉树。 例如,一旦建立了中序线索二叉树后,用户程序就可以设计一个正向循环结构遍历该二叉树的所有结点,循环初始定位在中序线索二叉树的第一个结点位置,每次循环使指针指向当前结点的中序遍历的后继结点位置,当指针指向中序线索二叉树的最后一个结点位置后循环过程结束;或者用户程序可以设计一个反向循环结构遍历该二叉树的所有结点,循环初始定位在中序线索二叉树的最后一个结点位置,每次循环使指针指向当前结点的中序遍历的前驱结点位置,当指针指向中序线索二叉树的第一个结点位置前循环过程结束。 作业 (a)WPL = 1×2+3×2+5×2+7×2 = 32 (b)WPL = 1×2+3×3+5×3+7×1 = 33 (c)WPL = 7×3+5×3+3×2+1×1 = 43 (d)WPL = 1×3+3×3+5×2+7×1 = 29 具有最小带权路径长度的二叉树称作哈夫曼(Huffman)树(或称最优二叉树)。图(d)的二叉树是一棵哈夫曼树。 定义:由给定的n个叶结点权值可以构造很多棵形态不同的二叉树,WPL值最小的二叉树称为哈夫曼树。 要使一棵二叉树的带权路径长度WPL值最小,必须使权值越大的叶结点越靠近根结点。哈夫曼树构造算法为: (1)由给定的n个权值{w1,w2,…,wn}构造n棵只有根结点的二叉树,从而得到一个二叉树森林F={T1,T2,…,Tn}。 (2)在二叉树森林F中选取根结点的权值最小和次小的两棵二叉树作为新的二叉树的左右子树构造新的二叉树,新的二叉树的根结点权值为左右子树根结点权值之和。 (3)在二叉树森林F中删除作为新二叉树左右子树的两棵二叉树,将新二叉树加入到二叉树森林F中。 (4)重复步骤(2)和(3),当二叉树森林F中只剩下一棵二叉树时,这棵二叉树就是所构造的哈夫曼树。 2.哈夫曼编码问题 将传送的文字转换为二进制字符0和1组成的二进制串的过程为编码。 例:假设要传送的电文为ABACCDA,电文中只有A,B,C,D四种字符,若这四个字符采用表(a)所示的编码方案,则电文的代码为00 01 00 10 10 11 00,代码总长度为14。若这四个字符采用表(b)所示的编码方案,则电文的代码为0 110 0 10 10 111 0,代码总长度为13。 字符 编码 A 00 B 01 C 10 D 11 字符 编码 A 0 B 110 C 10 D 111 (a) (b) 哈夫曼树可用于构造代码总长度最短的编码方案。具体构造方法如下:设需要编码的字符集合为{d1,d2,…,dn},各个字符在电文中出现的次数集合为{w1,w2,…,wn},以d1,d2,…,dn作为叶结点,以w1,w2,…,wn作为各叶结点的权值构造一棵二叉树,规定哈夫曼树中的左分支为0,右分支为1,则从根结点到每个叶结点所经过的分支对应的0和1组成的序列便为该结点对应字符的编码。代码总长度最短的不等长编码称之为哈夫曼编码。 不等长编码不允许存在前缀码。前缀码的一个例子如:A为01,B为010。如编码存在前缀码,则译码会出现二义性。 问题:为什么哈夫曼编码一定不会出现前缀码? 3.哈夫曼编码的软件设计 为了在构造哈夫曼树时能方便的实现从双亲结点到左右孩子结点的操作,在进行哈夫曼编码时能方便的实现从孩子结点到双亲结点的操作。设计哈夫曼树的结点存储结构为双亲孩子存储结构。采用仿真指针实现,每个结点的数据结构设计为: weight flag parent leftChild rightChild 一、哈夫曼编码的数据结构设计 从哈夫曼树求叶结点的哈夫曼编码实际上是从叶结点到根结点路径分支的逐个遍历,

你可能感兴趣的:(C语言打印以二叉树存储的树)