五章节二叉树及应用.ppt
《五章节二叉树及应用.ppt》由会员分享,可在线阅读,更多相关《五章节二叉树及应用.ppt(82页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、五章节二叉树及应用 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望学习要点:学习要点:二叉树的递归概念,这与二叉树各种基本运算具有密切关联。二叉树的递归概念,这与二叉树各种基本运算具有密切关联。满二叉树和完全二叉树概念,二叉树和完全二叉树基本性质。满二叉树和完全二叉树概念,二叉树和完全二叉树基本性质。二叉树的顺序存储与二叉链表存储结构。二叉树的顺序存储与二叉链表存储结构。二叉树遍历的基本思想和基于递归与非递归实现算法。二叉树遍历的基本思想和基于递归与非递归实现算法
2、。线索二叉树概念,二叉树的线索化和遍历。线索二叉树概念,二叉树的线索化和遍历。Huffman树概念与基本算法;树概念与基本算法;Huffman编码和实现算法。编码和实现算法。25.1 二叉树及其基本性质二叉树及其基本性质5.1.1 二叉树基本概念二叉树基本概念“二叉树二叉树”是一个满足下述条件的由结点组成的有限集合是一个满足下述条件的由结点组成的有限集合E:当当E为空集时,定义其为空二叉树;为空集时,定义其为空二叉树;当当E非空时,分为两种情形。非空时,分为两种情形。如果如果E为单元素集合,定义其为一棵为单元素集合,定义其为一棵根二叉树根二叉树;如果如果E为多于一个结点的集合,则为多于一个结点
3、的集合,则E中应当具有唯一一个结点中应当具有唯一一个结点r称称其为根结点,而集合其为根结点,而集合E=E r也是一棵二叉树,称为也是一棵二叉树,称为r的子二叉的子二叉树。此时,结点树。此时,结点r至多只能有两棵不相交的子二叉树,并且相应至多只能有两棵不相交的子二叉树,并且相应子二叉树有左右之分,分别称为子二叉树有左右之分,分别称为r的的左子树左子树和和右子树右子树。3其它一些相关概念:其它一些相关概念:结点的结点的度:度:结点拥有的子树棵数结点拥有的子树棵数 结点的结点的深度深度(层次层次):):根结点看做第根结点看做第0层,其余结点的层次值为其层,其余结点的层次值为其父结点所在层值加父结点所
4、在层值加1 树的度:树的度:树中所有结点度的最大值树中所有结点度的最大值树的深度:树的深度:树中最大层次数树中最大层次数 4根结点、叶结点、内部结点根结点、叶结点、内部结点子结点、父结点、兄弟结点、堂兄弟结点、子结点、父结点、兄弟结点、堂兄弟结点、子孙结点、祖先结点;子孙结点、祖先结点;5.1.1 二叉树基本概念二叉树基本概念21、二叉树的特征、二叉树的特征二叉树可以没有任何结点,即是一个空二叉树。二叉树可以没有任何结点,即是一个空二叉树。二叉树中每个结点至多只有两棵子树,而这两棵子树作为结点二叉树中每个结点至多只有两棵子树,而这两棵子树作为结点集合互不相交;集合互不相交;二叉树中结点的两棵子
5、树有左、右之分,次序不能颠倒。二叉树中结点的两棵子树有左、右之分,次序不能颠倒。2、二叉树基本类型、二叉树基本类型55.1.2 满二叉树和完全二叉树满二叉树和完全二叉树1、满二叉树、满二叉树 如果一棵二叉树满足下述条件,就称其为满二叉树(如果一棵二叉树满足下述条件,就称其为满二叉树(full binary tree):):每个结点或是度数为每个结点或是度数为2(具有两个非空子树)的结点,或是(具有两个非空子树)的结点,或是度数为度数为0的(叶)结点;的(叶)结点;所有叶结点都在同一层。所有叶结点都在同一层。65.1.2 满二叉树和完全二叉树满二叉树和完全二叉树22、完全二叉树、完全二叉树若一棵
6、二叉树满足下述条件,就称其为完全二叉树若一棵二叉树满足下述条件,就称其为完全二叉树(complete binary tree):):至多只有最下两层中结点的度数小于至多只有最下两层中结点的度数小于2;最下一层的叶结点都依次排列在该层最左边位置。最下一层的叶结点都依次排列在该层最左边位置。75.1.2 满二叉树和完全二叉树满二叉树和完全二叉树22、完全二叉树、完全二叉树2重点理解:重点理解:满二叉树是完全二叉树,但完全二叉树却不一定是满二叉树。满二叉树是完全二叉树,但完全二叉树却不一定是满二叉树。空二叉树和根二叉树既是满二叉树,也是完全二叉树。空二叉树和根二叉树既是满二叉树,也是完全二叉树。完全
7、二叉树可以看作是在满二叉树的最下一层,从右向左连续去完全二叉树可以看作是在满二叉树的最下一层,从右向左连续去掉若干个结点后得到二叉树。掉若干个结点后得到二叉树。完全二叉树中的一个结点如果没有左子结点,就一定没有右子结完全二叉树中的一个结点如果没有左子结点,就一定没有右子结点。点。8练习:练习:1、完全二叉树某结点若无右子树则定无左子树。、完全二叉树某结点若无右子树则定无左子树。2、完全二叉树某结点若无左子树则定无右子树。、完全二叉树某结点若无左子树则定无右子树。95.1.3 二叉树基本性质二叉树基本性质性质性质5-1 一棵二叉树第一棵二叉树第i(i0)层上至多只能有)层上至多只能有 个结点。个
8、结点。102i证明:应用数学归纳法。证明:应用数学归纳法。二叉树第二叉树第0层有一个结点,即当层有一个结点,即当i=0时,时,2i=20=1成立。成立。假设结论对第假设结论对第i层成立,即第层成立,即第i层至多只能有层至多只能有2i个结点。注意到个结点。注意到二叉树每个结点的度最多为二叉树每个结点的度最多为2,第,第i+1层结点个数至多只能层结点个数至多只能是第是第i层结点个数的层结点个数的2倍,即倍,即2*2i=2i+1,归纳完成,命题得,归纳完成,命题得证。证。5.1.3 二叉树基本性质二叉树基本性质211性质性质5-2 树高为树高为k(k0)的二叉树,最多有)的二叉树,最多有 个结点。个
9、结点。2k+1-1证明证明:由性质由性质5-1可知在树高为可知在树高为k的二叉树当中,第的二叉树当中,第0层有层有20个结点,第个结点,第1层有层有21个结点,第个结点,第2层有层有22个结点,个结点,第,第k层有层有2k个结点。由个结点。由此可知,树高为此可知,树高为k的二叉树结点个数总数为的二叉树结点个数总数为20+21+22+2k。这是一个公比为这是一个公比为p=2的等比数列,前的等比数列,前k+1项和项和Sk+1为:为:Sk+1=(a0 ak p)/(1p)=(202k 2)/(12)=(12k+1)/(12)=2k+115.1.3 二叉树基本性质二叉树基本性质3性质性质5-3 如果二
10、叉树中度为如果二叉树中度为0结点数为结点数为n0,度为,度为2结点数为结点数为n2,则则 成立。成立。12n0=n2+1证明:设结点总数证明:设结点总数 n=n0+n1+n2 又因为:结点数又因为:结点数n=边数边数+1 边数边数=n1+2*n2 即即n0+n1+n2=n1+2n2+1 所以:所以:n0=n2+1结点数结点数n=边数边数+1练习:练习:一棵树的度为一棵树的度为4,n4=2,n3=3,n2=4,求,求n0?13解:解:结点数结点数=边数边数+1 n0+n1+n2+n3+n4=n1+2*n2+3*n3+4*n4+1 n0+2+3+4=8+9+8+1 n0=17练习:练习:设完全二叉
11、树有设完全二叉树有1000个结点,求叶子结点个数?有多少个个结点,求叶子结点个数?有多少个度为度为1的结点?度为的结点?度为2的结点呢?的结点呢?14解:设二叉树中叶子结点、度为解:设二叉树中叶子结点、度为1、度为、度为2的结点数目的结点数目 分别分别n0、n1、n2,其中完全二叉树中其中完全二叉树中n1只能为只能为1或或0,则:,则:n0+n1+n2=1000n0=n2+1n1=0 或或 n1=1n0=500n1=1n2=499复习两个概念:复习两个概念:(1)满二叉树满二叉树:深度为:深度为k的满二叉树有的满二叉树有 个结点。个结点。152k+1-1 对满二叉树按层次从上到下,从左到右,不
12、留一个空对满二叉树按层次从上到下,从左到右,不留一个空位进行编号,号码位进行编号,号码1n。(2)完全二叉树完全二叉树:结点数为:结点数为n的完全二叉树上各个结点与同深的完全二叉树上各个结点与同深度的满二叉树前度的满二叉树前n个相应位置结点编号一一对应。个相应位置结点编号一一对应。5.1.3 二叉树基本性质二叉树基本性质416性质性质5-4 设设BT为具为具n个结点的完全二叉树,将个结点的完全二叉树,将BT所有结点按照所有结点按照从上到下、从左到右的顺序(二叉树的层序)进行编号。则从上到下、从左到右的顺序(二叉树的层序)进行编号。则BT中任意结点中任意结点N的序号的序号i(1in)具有下述性质
13、。)具有下述性质。(1)若)若i=1,则,则N为为BT根结点,根结点,N无父结点;无父结点;(2)若)若i1,则,则N父结点序号为父结点序号为 (即(即i除以除以2后向下取整);后向下取整);(3)若)若2in,则,则N无左子树,否则其左子结点(即左子树的根无左子树,否则其左子结点(即左子树的根结点)序号为结点)序号为2i;(4)若)若2i+1n,则,则N无右子树,否则其右子结点(即右子树的无右子树,否则其右子结点(即右子树的根结点)序号为根结点)序号为2i+1。练习:练习:1、1000个结点的完全二叉树最大的分支结点编号为个结点的完全二叉树最大的分支结点编号为 。2、n个结点的完全二叉树深度
14、为个结点的完全二叉树深度为 。17500int(log2n)5.2 二叉树存储二叉树存储5.2.1 二叉树顺序存储二叉树顺序存储 预留最大空间预留最大空间 深度为深度为k的二叉树预留的二叉树预留2k+1-1个存储单元,按编号顺序存个存储单元,按编号顺序存储,遇空结点留空位。储,遇空结点留空位。185.2.1 二叉树顺序存储二叉树顺序存储2适合满(完全)二叉树,求双亲、孩子方便适合满(完全)二叉树,求双亲、孩子方便不适合深度较大、结点不多的二叉树不适合深度较大、结点不多的二叉树195.2.2 二叉树链式存储二叉树链式存储1、二叉链表存储、二叉链表存储 让一个存储结点只包含与其子树的邻接关系,那么
15、就是让一个存储结点只包含与其子树的邻接关系,那么就是二叉树的二叉链表存储结构。二叉树的二叉链表存储结构。205.2.2 二叉树链式存储二叉树链式存储1、二叉链表存储、二叉链表存储221用用C语言定义二叉链表的结构类型如下:语言定义二叉链表的结构类型如下:struct node DataType data;/*定义数据域,定义数据域,DataType代表实际需要的类型代表实际需要的类型*/struct node *lch;/*定义左孩子域,指向左孩子地址定义左孩子域,指向左孩子地址*/struct node *rch;/*定义右孩子域,指向右孩子地址定义右孩子域,指向右孩子地址*/;typede
16、f struct node bitree;/*定义二叉树结点类型为定义二叉树结点类型为bitree*/1、二叉链表存储、二叉链表存储3算法算法5-1 创建一棵只有根结点的二叉树算法。创建一棵只有根结点的二叉树算法。创建只有以创建只有以x为根结点的二叉树为根结点的二叉树Bt,x的数据类型为的数据类型为DataType,相,相应结点的应结点的Lchild和和Rchild域均取值域均取值NULL,返回指向根结点的指针。,返回指向根结点的指针。2200Create_Bt(DataType x)01 02 bitree*Bt,*ptr;03 ptr=(bitree*)malloc(sizeof(bitr
17、ee);/*申请存储结点申请存储结点*/04 Bt=ptr;05 ptr-data=x;06 ptr-lch=NULL;07 ptr-rch=NULL;08 return(Bt);09 1、二叉链表存储、二叉链表存储4算法算法5-2 在指定左子结点处插入一个新结点。在指定左子结点处插入一个新结点。已知二叉链表已知二叉链表Bt,在指针,在指针Parent所指结点左子结点处插入一个数所指结点左子结点处插入一个数据元素值为据元素值为x的新结点,使之成为的新结点,使之成为Parnet所指结点新的左子树根结点。所指结点新的左子树根结点。23 bitree*Inl_Bt(bitree*Bt,bitree*
18、Parent,DataType x)if(Parent=NULL)printf(位置错!位置错!);return(NULL);ptr=(bitree*)malloc(sizeof(bitree);/*申请存储结点空间申请存储结点空间*/ptr-data=x;ptr-lch=NULL;ptr-rch=NULL;if(Parent-lch=NULL)/*Parent所指结点左子树为空所指结点左子树为空*/Parent-lch=ptr;else /*Parent所指结点左子树非空所指结点左子树非空*/ptr-lch=Parent-lch;Parent-lch=ptr;return(Bt)5.2.2
19、二叉树链式存储二叉树链式存储22、三叉链表存储、三叉链表存储 同时反映当前结点与其左子树的根结点、右子树的根同时反映当前结点与其左子树的根结点、右子树的根结点和与其父结点关联。结点和与其父结点关联。245.2.2 二叉树链式存储二叉树链式存储22、三叉链表存储、三叉链表存储2255.3 二叉树的遍历二叉树的遍历按照某种确定方式对二叉树进行访问,但要求二叉树中每按照某种确定方式对二叉树进行访问,但要求二叉树中每个结点被访问一次且只被访问一次。个结点被访问一次且只被访问一次。1、先序、中序和后序遍历、先序、中序和后序遍历对左、右子树,限定对左、右子树,限定“先访左后访右先访左后访右”,那么访问结点
20、的,那么访问结点的顺序顺序有有三种不同的组合形式:三种不同的组合形式:TLR、LTR、LRT。通常,称通常,称TLR为二叉树的先序(先根)遍历,为二叉树的先序(先根)遍历,LTR为中序为中序(中根)遍历,(中根)遍历,LRT为后序(后根)遍历。为后序(后根)遍历。26例子:例子:以三种遍历方式访问如图所示的二叉树。以三种遍历方式访问如图所示的二叉树。27解:解:先序遍历序列先序遍历序列 A-B-D-H-E-C-F-I-G-J-K中序遍历序列中序遍历序列 D-H-B-E-A-I-F-C-J-G-K后序遍历序列后序遍历序列 H-D-E-B-I-F-J-K-G-C-A例子:例子:已知二叉树已知二叉树
21、先先序遍历序列是序遍历序列是A-B-C-D-E-F-G,中序遍历序,中序遍历序列是列是C-B-D-A-E-G-F。由这两个序列可唯一确定一棵二叉树。由这两个序列可唯一确定一棵二叉树。28解:从先序遍历序列第一个结点可知二叉树根结点是解:从先序遍历序列第一个结点可知二叉树根结点是A。由结点。由结点A在在中序遍历序列里位置可知该根结点左子树包含结点中序遍历序列里位置可知该根结点左子树包含结点C-B-D,右子树包,右子树包含结点含结点E-G-F,如图,如图5-22所示。由中序序列片段所示。由中序序列片段C-B-D可知,可知,B是是A左子树根结点,再结合先序序列片段左子树根结点,再结合先序序列片段B-
22、C-D可知,可知,C和和D分别是分别是B的的左右子结点。由先序序列片段左右子结点。由先序序列片段E-F-G可知,可知,E是是A的右子结点,再由的右子结点,再由先序序列片段先序序列片段F-G和中序序列片段和中序序列片段G-F可知,可知,F不能是不能是E的左子结点,的左子结点,故只能是故只能是E的右子结点,并且的右子结点,并且G是是F的左子结点。的左子结点。29练习:练习:1、已知二叉树先序遍历序列为、已知二叉树先序遍历序列为ABCDEFGH,中序遍历序列为,中序遍历序列为CDBAFEHG,试画出此二叉树。,试画出此二叉树。2、已知二叉树后序遍历序列为、已知二叉树后序遍历序列为DCBFHGEA,中
23、序遍历序列为,中序遍历序列为CDBAFEHG,求先序遍历序列。,求先序遍历序列。305.3 二叉树的遍历二叉树的遍历22、基于递归遍历算法、基于递归遍历算法递归步骤递归步骤(先序遍历先序遍历):):访问根结点;访问根结点;先序遍历访问左子二叉树;先序遍历访问左子二叉树;先序遍历访问右子二叉树。先序遍历访问右子二叉树。312、基于递归遍历算法、基于递归遍历算法2算法算法5-4 二叉树先序遍历递归算法。二叉树先序遍历递归算法。已知二叉树已知二叉树Bt,对其进行先序遍历,若二叉树为空,则为空操作;否则进,对其进行先序遍历,若二叉树为空,则为空操作;否则进行如下操作:访问二叉树根结点;先序遍历二叉树的
24、左子树;先序遍历二叉树行如下操作:访问二叉树根结点;先序遍历二叉树的左子树;先序遍历二叉树的右子树。的右子树。3200 Pret_Bt(bitree*Bt)01 02 if(Bt!=NULL)03 04 printf(%c,Bt-data);/*访问根结点访问根结点*/05 Pret_Bt(Bt-lch);/*先序遍历左子树先序遍历左子树*/06 Pret_Bt(Bt-rch);/*先序遍历右子树先序遍历右子树*/07 08 2、基于递归遍历算法、基于递归遍历算法2基于递归调用先序遍历基于递归调用先序遍历:332、基于递归遍历算法、基于递归遍历算法2先序递归算法应用实例先序递归算法应用实例:先
25、序建立二叉树先序建立二叉树bitree *creat()bitree *t;int x;scanf(“%d”,&x);if(x=0)t=NULL;else t=(bitree*)malloc(sizeof(bitree);t-data=x;t-lch=creat();t-rch=creat();return t;2、基于递归遍历算法、基于递归遍历算法2先序递归算法应用实例先序递归算法应用实例:先序建立二叉树先序建立二叉树(续续)主程序调用主程序调用:main()bitree *root;root=creat();例:例:建立如图二叉树应该如何输入?建立如图二叉树应该如何输入?练习:练习:测试用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 章节 二叉 应用
限制150内