数据结构-树和二叉树.ppt

上传人:牧羊曲112 文档编号:4980244 上传时间:2023-05-27 格式:PPT 页数:91 大小:248.50KB
返回 下载 相关 举报
数据结构-树和二叉树.ppt_第1页
第1页 / 共91页
数据结构-树和二叉树.ppt_第2页
第2页 / 共91页
数据结构-树和二叉树.ppt_第3页
第3页 / 共91页
数据结构-树和二叉树.ppt_第4页
第4页 / 共91页
数据结构-树和二叉树.ppt_第5页
第5页 / 共91页
点击查看更多>>
资源描述

《数据结构-树和二叉树.ppt》由会员分享,可在线阅读,更多相关《数据结构-树和二叉树.ppt(91页珍藏版)》请在三一办公上搜索。

1、第6章 树和二叉树,6.1 树的定义和基本术语6.2 二叉树6.3 遍历二叉树6.4 线索二叉树6.5 树和森林6.6 哈夫曼树,教学目的、要求,1领会树和二叉树的类型定义,理解树和二叉树的结构差别。2熟记二叉树的主要特性,并掌握它们的证明方法。3熟练掌握二叉树的各种遍历算法,并能灵活运用遍历算法实现二叉树的其它操作。4理解二叉树的线索化过程以及在中序线索化树上找给定结点的前驱和后继的方法。5熟练掌握二叉树和树的各种存储结构及其建立的算法。6学会编写实现树的各种操作的算法。7了解最优树的特性,掌握建立最优树和赫夫曼编码的方法。,6.1 树的定义和基本术语树的定义,树是由n(n0)个结点组成的有

2、限集合。若n=0,称为空树;若n0,则:有一个特定的称为根(root)的结点。它只有直接后继,但没有直接前驱;除根结点以外的其它结点可以划分为m(m0)个互不相交的有限集合T0,T1,Tm-1,每个集合Ti(i=0,1,m-1)又是一棵树,称为根的子树,每棵子树的根结点有且仅有一个直接前驱,但可以有0个或多个直接后继。由此可知,树的定义是一个递归的定义,即树的定义中又用到了树的概念。,树的结构参见下图:,图6.1树的结构,在图6.1(c)中,树的根结点为A,该树还可以分为三个互不相交子集T0,T1,T2,其中T0=B,E,F,J,K,L,T1=C,G,T2=D,H,I,M,其中的T0,T1,T

3、2都是树,称为图6.1(C)中树的子树,而T0,T1,T2又可以分解成若干棵不相交子树。如T0可以分解成T00,T01两个不相交子集,T00=E,J,K,L,T01=F,而T00又可以分为三个不相交子集T000,T001,T002,其中,T000=J,T001=K,T002=L。,树的抽象数据类型定义见教材P118-119,6.1.2 基本术语,1.结点指树中的一个数据元素,一般用一个字母表示。2.度一个结点包含子树的数目,称为该结点的度。3.树叶(叶子)度为0的结点,称为叶子结点或树叶,也叫终端结点。4.孩子结点若结点X有子树,则子树的根结点为X的孩子结点,也称为孩子,儿子,子女等。如图6.

4、1(c)中A的孩子为B,C,D。5.双亲结点若结点X有子女Y,则X为Y的双亲结点。,6.祖先结点从根结点到该结点所经过分枝上的所有结点为该结点的祖先,如图6-1(c)中M的祖先有A,D,H。7.子孙结点某一结点的子女及子女的子女都为该结点子孙。8.兄弟结点具有同一个双亲的结点,称为兄弟结点。9.分枝结点除叶子结点外的所有结点,为分枝结点,也叫非终端结点。10.层数根结点的层数为1,其它结点的层数为从根结点到该结点所经过的分支数目再加1。,11.树的深度(高度)树中结点所处的最大层数称为树的高度,如空树的高度为0,只有一个根结点的树高度为1。12.树的度树中结点度的最大值称为树的度。13.有序树

5、若一棵树中所有子树从左到右的排序是有顺序的,不能颠倒次序。称该树为有序树。14.无序树若一棵树中所有子树的次序无关紧要,则称为无序树。15森林若干棵互不相交的树组成的集合为森林。一棵树可以看成是一个特殊的森林。,6.1.3 树的表示1.树形结构表示法,2.凹入法表示法,图6.1(c)的树的凹入法表示,3.嵌套集合表示法,图6.1(c)的嵌套集合表示,4.广义表表示法,对图6-1(c)的树结构,广义表表示法可表示为:(A(B(E(J,K,L),F),C(G),D(H(M),I),6.1.4 树的性质,性质1 树中的结点数等于所有结点的度加1。证明:根据树的定义,在一棵树中,除根结点以外,每个结点

6、有且仅有一个直接前驱,也就是说,每个结点与指向它的一个分支一一对应,所以,除根结点以外的结点数等于所有结点的分支数(即度数),而根结点无直接前驱,因此,树中的结点数等于所有结点的度数加1。,性质2 度为k的树中第i层上最多有ki-1个结点(i1)。下面用数学归纳法证明:对于i=1,显然成立,假设对于i-1层,上述条件成立,即第i-1层最多有ki-2个结点,对于第i层,结点数最多为第i-1层结点数的k倍(因为度为k),故第i层的结点数为ki-2*k=ki-1。,性质3 深度为h的 k叉树最多有 个结点。证明:由性质2可知,若每一层的结点数最多,则整个k叉树结点数最多,共有 当一棵K叉树上的结点数

7、达到 时,称为满K叉树。,性质4 具有n个结点的k叉树的最小深度为。(表示取不小于x的最小整数)证明:设具有n个结点的k叉树的深度为h,在该树的前面h-1层都是满的,即每一层的结点数等于ki-1个(1ih-1),第h层(即最后一层)的结点数可能满,也可能不满,这时,该树具有最小的深度。由性质3知道,结点数n应满足下面条件:,通过转换为:kh-1n(k-1)+1kh,再取以k为底的对数后,可以得到:h-1logk(n(k-1)+1)h即有:logk(n(k-1)+1)hlogk(n(k-1)+1)+1,而h只能取整数,所以,该k叉树的最小深度为:h=,6.2 二叉树,为何要重点研究每结点最多只有

8、两个 叉 的树?二叉树的结构最简单,规律性最强;可以证明,所有树都能转为唯一对应的二叉树,不失一般性。,6.2.1 二叉树的定义,和树结构定义类似,二叉树的定义也可以递归形式给出:二叉树是n(n0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵不相交的左子树和右子树组成。,二叉树的特点是每个结点最多有两个孩子,或者说,在二叉树中,不存在度大于2的结点,并且二叉树是有序树(树为无序树),其子树的顺序不能颠倒,因此,二叉树有五种不同的形态,参见图6.5。,图6.5 二叉树的五种不同形态,问:具有3个结点的二叉树可能有几种不同形态?,有五种,二叉树的的抽象数据类型定义见教材P121。

9、,性质1 二叉树的第i层结点数,最多为2i-1个(i1)。性质2 深度为k的二叉树最大结点数为2k-1(i1)。,性质3 对任意一棵二叉树,如果叶子结点个数为n0,度为2的结点个数为n2,则有n0=n2+1。证明:设二叉树中度为1的结点个数为n1,根据二叉树的定义可知,该二叉树的结点数n=n0+n1+n2。又因为在二叉树中,度为0的结点没有孩子,度为1的结点有1 个孩子,度为2的结点有2个结孩子,故该二叉树的孩子结点数为 n0*0+n1*1+n2*2。而一棵二叉树中,除根结点外所有的结点都为孩子结点,故该二叉树的结点数应为孩子结点数加1即:n=n0*0+n1*1+n2*2+1。因此,有 n=n

10、0+n1+n2=n0*0+n2*1+n2*2+1,最后得到n0=n2+1。,为继续给出二叉树的其它性质,先定义两种特殊的二叉树。满二叉树深度为k具有2k-1个结点的二叉树,称为满二叉树。从上面满二叉树定义可知,必须是二叉树的每一层上的结点数都达到最大,否则就不是满二叉树。完全二叉树对满二叉树的结点,从根结点起,自上而下,自左至右进行连续编号。如果一棵具有n个结点的深度为k的二叉树,它的每一个结点都与深度为k的满二叉树中编号为1 n的结点一一对应,则称这棵二叉树为完全二叉树。,从满二叉树及完全二叉树定义可以知道,满二叉树一定是一棵完全二叉树,反之完全二叉树不一定是一棵满二叉树。满二叉树的叶子结点

11、全部在最底层,而完全二叉树的叶子结点可以分布在最下面两层。深度为4的满二叉树和完全二叉树如图6.6所示。,图6.6 满二叉树和完全二叉树,性质4 具有n个结点的完全二叉树深度为 或。性质5 如果将一棵有n个结点的完全二叉树从上到下,从左到右对结点编号1,2,n,并简称编号为i的结点为i(1in),则有如下结论成立:若 i=1,则结点i为根结点,无双亲,否则i的双亲为;若2in,则结点i无左孩子,否则i的左孩子为2i。即满足2in的结点为叶子结点;若2i+1n,则结点i无右孩子,否则i的右孩子为2i+1;若结点i为奇数且不等于1,则它的左兄弟为i-1;若结点i为偶数且不等于n,它的右兄弟为i+1

12、;结点i所在层数(层次)为;,6.2.3 二叉树的存贮结构1.顺序存贮结构,按二叉树的结点自上而下、从左至右编号,用一组连续的存储单元存储。若该二叉树为非完全二叉树,则必须将相应位置空出来,使存放的结果符合完全二叉树形状。,图6.7 二叉树的顺序存储,对于一棵二叉树,若采用顺序存贮时,当它为完全二叉树时,比较方便,若为非完全二叉树,将会浪费大量存贮存贮单元。最坏的非完全二叉树是全部只有右分支,设高度为K,则需占用2K-1个存贮单元,而实际只有k个元素,实际只需k个存储单元。因此,对于非完全二叉树,宜采用下面的链式存储结构。,2.二叉链表存贮结构 二叉链表表示,将一个结点分成三部分,一部分存放结

13、点本身信息,另外两部分为指针,分别存放左、右孩子的地址。注:如果需要倒查某结点的双亲,可以再增加一个双亲域(直接前趋)指针,将二叉链表变成三叉链表。,对于图6.7所示二叉树,用二叉链表形式描述。,图6.8 二叉树的二叉链表表示,二叉链表的数据类型bitree.h,/二叉链表定义#include using namespace std;typedef char TElemType;struct BiTNodeTElemType data;BiTNode*lchild,*rchild;typedef BiTNode*BiTree;,void initBiTree(BiTree,二叉链表的建立,为了

14、后面遍历二叉树方便,先介绍建立二叉链表的算法(假设ElemType 为char型)。,/按先序次序输入二叉树中结点的值(#表示空格),/构造二叉链表表示的二叉树T。void createBiTree(BiTree/构造右子树,6.3 遍历二叉树,遍历是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。所谓遍历二叉树,就是遵从某种次序,访问二叉树中的所有结点,使得每个结点仅被访问一次。这里提到的访问是指对结点施行某种操作,操作可以是输出结点信息,修改结点的数据值等,但要求这种访问不破坏它原来的数据结构。在本书中,我们规定访问是输出结点信息data,且以二叉链表作为二叉树

15、的存贮结构。,由于二叉树是一种非线性结构,每个结点可能有一个以上的直接后继,因此,必须规定遍历的规则,并按此规则遍历二叉树,最后得到二叉树所有结点的一个线性序列。令L、R、D分别代表二叉树的左子树、右子树、根结点,则遍历二叉树有6种规则:DLR、DRL、LDR、LRD、RDL、RKD。若规定二叉树中必须先左后右(左右顺序不能颠倒),则只有DLR、LDR、LRD三种遍历规则。DLR称为前根遍历(或前序遍历、先序遍历、先根遍历),LDR称为中根遍历(或中序遍历),LRD称为后根遍历(或后序遍历)。,6.3.1 前序遍历,所谓前序遍历,就是根结点最先遍历,其次左子树,最后右子树。,1.递归遍历,前序

16、遍历二叉树的递归遍历算法描述为:若二叉树为空,则算法结束;否则输出根结点;前根遍历左子树;前根遍历右子树。,/先序递归遍历T,对每个结点调用函数Visit一次且仅一次void preOrderTraverse(BiTree T,void(*visit)(TElemType)if(T)/T不空visit(T-data);/先访问根结点preOrderTraverse(T-lchild,visit);/再先序遍历左子树preOrderTraverse(T-rchild,visit);/最后先序遍历右子树,2.非递归遍历,利用一个一维数组作栈,来存贮二叉链表中结点,算法思想为:从二叉树根结点开始,沿

17、左子树一直走到末端(左孩子为空)为止,在走的过程中,访问所遇结点,并依次把所遇结点进栈,当左子树为空时,从栈顶退出某结点,并将指针指向该结点的右孩子。如此重复,直到栈为空或指针为空止。,/前序遍历二叉树T的非递归算法(利用栈),对每个数据元素调用函数Visitvoid preOrderTraverse1(BiTree T,void(*visit)(TElemType)BiTree s100;int top=0;/top为栈顶指针while(T!=NULL)|(top0)while(T!=NULL)visit(T-data);stop+=T;T=T-lchild;T=s-top;T=T-rchi

18、ld;,6.3.2 中序遍历,所谓中序遍历,就是根在中间,先左子树,然后根结点,最后右子树。中序遍历二叉树的递归遍历算法描述为:若二叉树为空,则算法结束;否则中根遍历左子树;输出根结点;中根遍历右子树。,/中序递归遍历T,对每个结点调用函数Visit一次且仅一次void inOrderTraverse(BiTree T,void(*visit)(TElemType)if(T)inOrderTraverse(T-lchild,visit);/先中序遍历左子树visit(T-data);/再访问根结点inOrderTraverse(T-rchild,visit);/最后中序遍历右子树,6.3.3

19、后序遍历,所谓后序遍历,就是根在最后,即先左子树,然后右子树,最后根结点。后序遍历二叉树的递归遍历算法描述为:若二叉树为空,则算法结束;否则后根遍历左子树:后根遍历历子树;访问根结点。,/后序递归遍历T,对每个结点调用函数Visit一次且仅一次void postOrderTraverse(BiTree T,void(*visit)(TElemType)if(T)inOrderTraverse(T-lchild,visit);/后序遍历左子树inOrderTraverse(T-rchild,visit);/再后序遍历右子树visit(T-data);/最后访问根结点,6.3.4 按层次遍历,对于

20、一棵二叉树,若规定遍历顺序为从上到下(上层遍历完才进入下层),从左到右(同一层从左到右进行,这样的遍历称为按层次遍历。,下面用一个一维数组来模拟队列,实现二叉树的层次遍历。,/层序遍历T(利用队列),对每个结点调用函数Visit一次且仅一次void levelOrderTraverse(BiTree T,void(*visit)(TElemType)BiTree q100,p;int f,r;/f,r类似于头尾指针q0=T;f=0;r=1;while(fdata);if(p-lchild!=NULL)qr+=p-lchild;/入队if(p-rchild!=NULL)qr+=p-rchild;

21、/入队,6.4 线索二叉树6.4.1 线索的概念,通过前面介绍的二叉树可知,遍历二叉树实际上就是将树中所有结点排成一个线性序列(即非线性结构线性化),在这样的线性序列中,很容易求得某个结点在某种遍历下的直接前驱和后继。然而,有时我们希望不进行遍历就能快速找到某个结点在某种遍历下的直接前驱和后继,这样,就应该把每个结点的直接前驱和直接后继记录下来。,为了做到这一点,可以在原来的二叉链表结点中,再增加两个指针域,一个指向前驱,一个指向后继,但这样做将会浪费大量存贮单元,存贮空间的利用率相当低(一个结点中有4个指针,1个指左孩子,1个指右孩子,1个指前驱,1个指后继),而原来的左、右孩子域有许多空指

22、针又没有利用起来(在有n个结点的二叉链表中必定存在n+1个空链域)。,为了不浪费存存贮空间,我们利用原有的孩子指针为空时来存放直接前驱和后继,这样的指针称为线索,加线索的过程称为线索化,加了线索的二叉树,称为线索二叉树,对应的二叉链表称为线索二叉链表。,在线索二叉树中,由于有了线索,无需遍历二叉树就可以得到任一结点在某种遍历下的直接前驱和后继。但是,我们怎样来区分孩子指针域中存放的是左、右孩子信息还是直接前驱或直接后继信息呢?为此,在二叉链表结点中,还必须增加两个标志域ltag、rtag。,ltag和rtag定义如下:,这样,二叉链表中每个结点还是有5个域,但其中只有2个指针,较原来的4个指针

23、要方便。增加线索后的二叉链表结点结构可描述如下:,前序序列为:ABCD。,图 前序线索,中序序列为:BADC。,图 中序线索,后序序列为:BDCA。,图 后序线索,6.4.3 线索的算法实现,在此,仅介绍中序线索二叉树的算法实现。为方便起见,依照线性表的存储结构,在二叉树的线索链表上也添加一个头结点,并令其lchild域的指针指向二叉树的根结点,其rchild域的指针指向中序遍历时访问的最后一个结点,并令二叉树中序序列中的第一个结点的lchild域指针和最后一个结点的rchild域的指针均指向头结点。,图 中序线索链表(中序序列为:BADC),由于线索化的实质是将二叉链表中的空指针改为指向前驱

24、或后继的线索,而前驱或后继的信息只有在遍历时才能得到,因此线索化的过程即为在遍历的过程中修改空指针的过程。为了记下遍历过程中访问结点的先后关系,需附设一个指针pre始终指向刚刚访问过的结点。,1.线索链表类型定义inthreading.h,#include using namespace std;typedef char TElemType;enum PointerTagLink,Thread;/Link=0:指针,Thread=1:线索struct BiThrNodeTElemType data;BiThrNode*lchild,*rchild;PointerTag ltag,rtag;ty

25、pedef BiThrNode*BiThrTree;,void createBiThrTree(BiThrTree,2.实现inthreading.cpp,#include inthreading.h/按先序次序输入二叉树中结点的值(#表示空格),构造二叉线索树Tvoid createBiThrTree(BiThrTree,/先序递归遍历T,对每个结点调用函数Visit一次且仅一次void preOrderTraverse(BiThrTree T,void(*visit)(TElemType)if(T)/T不空visit(T-data);/先访问根结点preOrderTraverse(T-lc

26、hild,visit);/再先序遍历左子树preOrderTraverse(T-rchild,visit);/最后先序遍历右子树BiThrTree pre;/全局变量,始终指向刚刚访问过的结点,void inThreading(BiThrTree p)/中序遍历进行中序线索化if(p)inThreading(p-lchild);/左子树线索化if(!p-lchild)/没有左孩子p-ltag=Thread;/前驱线索p-lchild=pre;/左孩子指针指向前驱if(!pre-rchild)/前驱没有右孩子pre-rtag=Thread;/后继线索pre-rchild=p;/前驱右孩子指针指向

27、后继(当前结点p)pre=p;/保持pre始终指向刚刚访问过的结点inThreading(p-rchild);/右子树线索化,/中序遍历二叉树T,并将其中序线索化,BiThrNode*inOrderThreading(BiThrTree T)BiThrNode*Thrt=new BiThrNode;/Thrt指向头结点 Thrt-ltag=Link;Thrt-rtag=Thread;Thrt-rchild=Thrt;/右指针回指if(!T)/若二叉树空,则左指针回指Thrt-lchild=Thrt;elseThrt-lchild=T;pre=Thrt;inThreading(T);/中序遍历进

28、行中序线索化pre-rtag=Thread;/最后一个结点线索化pre-rchild=Thrt;Thrt-rchild=pre;return Thrt;,/中序遍历二叉线索树T(头结点)的非递归算法void inTraverseThr(BiThrTree T,void(*visit)(TElemType)BiThrTree p;p=T-lchild;/p指向根结点while(p!=T)/空树或遍历结束时,p=Twhile(p-ltag=Link)p=p-lchild;visit(p-data);/访问左子树为空的结点while(p-rtag=Thread,6.5 树和森林6.5.1 树的存储结

29、构1.双亲表示法,它是以一组连续的存储单元来存放树中的结点,每个结点有两个域:一个是data域,存放结点信息,另一个是parent域,用来存放双亲的位置(指针)。,树的双亲表示法,2.孩子表示法,将一个结点所有孩子链接成一个单链表形,而树中有若干个结点,故有若干个单链表,每个单链表有一个表头结点,所有表头结点用一个数组来描述。,树的孩子表示法,3.双亲孩子表示法,将第1、2两种方法结合起来,则得到双亲孩子表示法。,双亲孩子表示法,4.孩子兄弟表示法,类似于二叉链表,但第一根链指向第一个孩子,第二根链指向下一个兄弟。,孩子兄弟表示法,6.5.2 树、森林和二叉树的转换1.树转换成二叉树(孩子-兄

30、弟表示法),可以分为三步:加线将树中同一结点的兄弟相连;抹线保留结点的最左孩子连线,删除其它孩子连线;旋转将同一孩子的连线绕左孩子旋转45度角。,讨论:二叉树怎样还原为树?要点:逆操作,把所有右孩子变为兄弟!,树转换成二叉树,2.森林转换成二叉树,将森林中每一棵树分别转换成二叉树;合并:使第n棵树接入到第n-1棵的右边并成为它的右子树,第 n-1 棵二叉树接入到第n-2 棵的右边并成为它的右子树,第2棵二叉树接入到第1棵的右边并成为它的右子树,直到最后剩下一棵二叉树为止。,森林转换成二叉树,3.二叉树还原成树或森林,右链断开将二叉树的根结点的右链及右链的右链等全部断开,得到若干棵无右子树的二叉

31、树。二叉树还原成树将中得到的每一棵二叉树都还原成树(与树转换成二叉树的步骤刚好相反)。,二叉树还原成森林的过程,6.5.3 树和森林的遍历,在树和森林中,一个结点可能有两棵以上的子树,所以不宜讨论它们的中序遍历,即树和森林只有先序遍历和后序遍历。,1.先序遍历,树的先序遍历若树非空,则先访问根结点,然后依次先序遍历各子树。森林的先序遍历若森林非空,则先访问森林中第一棵树的根结点,再先序遍历第一棵树各子树,接着先序遍历第二棵树、第三棵树、直到最后一棵树。,2.后序遍历,树的后序遍历若树非空,则依次后序遍历各子树,最后访问根结点。森林的后序遍历按顺序后序遍历森林中的每一棵树。另外,请注意,树和森林

32、的先序遍历等价于它转换成的二叉树的先序遍历,树和森林的后序遍历等价于它转换成的二叉树的中序遍历。,6.6 哈夫曼树6.6.1 基本术语,1.路径和路径长度在一棵树中,从一个结点往下可以达到的孩子或子孙结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。2.结点的权及带权路径长度若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。,3.树的带权路径长度树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为其中n 为叶子结点数目,wk为第k

33、个叶子结点的权值,lk为第k个叶子结点的路径长度。,4.哈夫曼树在一棵二叉树中,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。例如,给定叶子结点的权分别为1,3,5,7,则可以得到如下图所示的不同二叉树。,具有不同带权路径长度的二叉树,在哈夫曼树中,权值大的结点离根最近。,6.6.2 哈夫曼树构造,假设有n个权值,则构造出的哈夫曼树有n个叶子结点。n个权值分别设为 w1,w2,wn,则哈夫曼树的构造规则为:将w1,w2,wn看成是有n 棵树的森林(每棵树仅有一个结点);在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的

34、根结点权值为其左、右子树根结点权值之和;从森林中删除选取的两棵树,并将新树加入森林;重复、步,直到森林中只剩一棵树为止,该树即为我们所求得的哈夫曼树。,下面给出哈夫曼树的构造过程,假设给定的叶子结点的权分别为1,5,7,3,则构造哈夫曼树过程如图所示。,哈夫曼树构造的过程,从上图可知,n 个权值构造哈夫曼树需n-1次合并,每次合并,森林中的树数目减1,最后森林中只剩下一棵树,即为我们求得的哈夫曼树。,6.6.3 哈夫曼树的应用1.哈夫曼编码,通信中,可以采用0、1的不同排列来表示不同的字符,称为二进制编码。而哈夫曼树在数据编码中的应用,是数据的最小冗余编码问题,它是数据压缩学的基础。若每个字符

35、出现的频率相同,则可以采用等长的二进制编码,若频率不同,则可以采用不等长的二进编码,频率较大的采用位数较少的编码,频率较小的字符采用位数较多的编码,这样可以使字符的整体编码长度最小,这就是最小冗余编码的问题。,而哈夫曼编码就是一种不等长的二进制编码,且哈夫曼树是一种最优二叉树,它的编码也是一种最优编码,在哈夫曼树中,规定往左编码为0,往右编码为1,则得到叶子结点编码为从根结点到叶子结点中所有路径中0和1的顺序排列。,例如,给定权1,5,7,3,得到的哈夫曼树及编码见下图(假定权值就代表该字符名字)。,哈夫曼编码,2.哈夫曼译码,在通信中,若将字符用哈夫曼编码形式发送出去,对方接收到编码后,将编码还原成字符的过程,称为哈夫曼译码。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号