《数据结构-C语言描述》第6章:树.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《《数据结构-C语言描述》第6章:树.ppt》由会员分享,可在线阅读,更多相关《《数据结构-C语言描述》第6章:树.ppt(67页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章第六章 树和二叉树树和二叉树 树的概念与定义树的概念与定义 二二 叉叉 树树 二叉树的遍历与线索化二叉树的遍历与线索化 树和森林树和森林 哈夫曼树及其应用哈夫曼树及其应用 树树的计数的计数6.1树的概念与定义树的概念与定义树的定义:树的定义:树树(tree)(tree)是是n(n0)n(n0)个结点的有个结点的有限集限集T T,当,当n=0n=0时,称为空树;当时,称为空树;当n0n0时,满时,满足以下条件:足以下条件:(1 1)有且仅有一个结点被称为树根)有且仅有一个结点被称为树根(rootroot)结点;)结点;(2 2)当)当n1n1时,除根结点以外的其余时,除根结点以外的其余n-
2、1n-1个个结点可以划分成结点可以划分成m(m0)m(m0)个互不相交的有限个互不相交的有限集集T1,T2,T1,T2,,TmTm,其中每一个集合本身又,其中每一个集合本身又是一棵树,称为根的子树是一棵树,称为根的子树(subtree)(subtree)。图6.1 结点结点(node)node):表示树中的元素,包括数表示树中的元素,包括数据项及若干指向其子树的分支。据项及若干指向其子树的分支。结点的度结点的度(degree)degree):结点拥有的子树的结点拥有的子树的数目。图数目。图6.16.1中结点中结点A A的度为的度为3 3。叶子叶子(leaf)leaf):度为度为0 0的结点称为
3、叶子结的结点称为叶子结点,也称为终端结点。图点,也称为终端结点。图6.16.1中,叶子中,叶子结点有:结点有:K K,L L,F F,G G,M M,I I,J J。分支结点分支结点:度不为度不为0 0的结点称为分支结的结点称为分支结点,也称为非终端结点。图点,也称为非终端结点。图6.16.1中,非中,非终端结点有:终端结点有:A A,B B,C C,D D等。等。孩子结点孩子结点(child)child):结点的子树的根称结点的子树的根称为该结点的孩子结点。图为该结点的孩子结点。图6.16.1中,结点中,结点A A的孩子结点为的孩子结点为B B,C C,D D,结点结点B B的孩子结的孩子结
4、点为点为E E,F F。双亲结点双亲结点(parents)parents):孩子结点的上层孩子结点的上层结点称为该结点的双亲结点。图结点称为该结点的双亲结点。图6.16.1中,中,结点结点I I的双亲为的双亲为D D,结点结点L L的双亲为的双亲为E E。兄弟结点兄弟结点(sibling)sibling):具有同一双亲结具有同一双亲结点的孩子结点之间互称为兄弟结点。图点的孩子结点之间互称为兄弟结点。图6.16.1中,结点中,结点B B,C C,D D互为兄弟,结点互为兄弟,结点K K,L L互为兄弟。互为兄弟。树的度树的度:树中最大的结点的度数即为树树中最大的结点的度数即为树的度。的度。图图6
5、.16.1中的树的度为中的树的度为3 3。结点的层次结点的层次(level)level):从根结点算起,从根结点算起,根为第一层,它的孩子为第二层根为第一层,它的孩子为第二层。若某结点在第若某结点在第l l层,则其孩子结点就在层,则其孩子结点就在第第l+1l+1层。图层。图6.16.1中,结点中,结点A A的层次为的层次为1 1,结点结点M M的层次为的层次为4 4。树的高度树的高度(depth)depth):树中结点的最大层树中结点的最大层次数。图次数。图6.16.1中的树的高度为中的树的高度为4 4。森林森林(forest)forest):m(mm(m0)0)棵互不相交的棵互不相交的树的集
6、合。树的集合。有序树与无序树有序树与无序树:树中结点的各子树从左树中结点的各子树从左至右是有次序的(不能互换)则称该树为至右是有次序的(不能互换)则称该树为有序树有序树,否则称该树为,否则称该树为无序树。无序树。6.2 二叉树二叉树二叉树的定义:二叉树的定义:二叉树是由二叉树是由n(n0)n(n0)个个结点的有限集结点的有限集T T构成,此集合或者为空构成,此集合或者为空集,或者由一个根结点及两棵互不相交集,或者由一个根结点及两棵互不相交的左右子树组成,并且左右子树都是二的左右子树组成,并且左右子树都是二叉树。叉树。注意:注意:二叉树的子树有左右之分,因此二叉树的子树有左右之分,因此二叉树是一
7、种有序树。二叉树是一种有序树。二叉树的性质:二叉树的性质:性质性质1 1 在二叉树的第在二叉树的第i i层上至多有层上至多有2 2i-1i-1个结点个结点(i i1)1)。性质性质2 2 深度为深度为k k的二叉树至多有的二叉树至多有2 2k k1 1个个结点(结点(k=1k=1)。)。性质性质3 3 对任意一棵二叉树对任意一棵二叉树BTBT,如果其如果其叶子结点数为叶子结点数为n n0 0,度为度为2 2的结点数为的结点数为n n2 2,则则n n0 0n n2 21 1。性质性质4 4 具有具有n n个结点的完全二叉树的深个结点的完全二叉树的深度为【度为【loglog2 2n n】1 1。
8、(。(符号【符号【x x】表示不表示不大于大于x x的最大整数。)的最大整数。)二叉树的性质:二叉树的性质:性质性质5 5 对于具有对于具有n n个结点的完全二叉树,个结点的完全二叉树,如果对其结点按层次编号,则对任一结点如果对其结点按层次编号,则对任一结点i(1in)i(1in),有:有:(1)(1)如如果果i=1i=1,则则结结点点i i是是二二叉叉树树的的根根,无无双双亲;如果亲;如果i1i1,则其双亲是【则其双亲是【i/2i/2】(2)(2)如如果果2 2inin,则则结结点点i i无无左左孩孩子子;如如果果2 2inin,则其左孩子是则其左孩子是2 2i i (3)(3)如如果果2
9、2i+1ni+1n,则则结结点点i i无无右右孩孩子子;如如果果2 2i+1ni+1n,则其右孩子是则其右孩子是2 2i+1i+1 满二叉树:满二叉树:一棵深度为一棵深度为k k且有且有2 2k k-1-1个结个结点的二叉树称为满二叉树。点的二叉树称为满二叉树。完全二叉树:完全二叉树:深度为深度为k k,有有n n个结点的二个结点的二叉树当且仅当其每一个结点都与深度为叉树当且仅当其每一个结点都与深度为k k的满二叉树中编号从的满二叉树中编号从1 1至至n n的结点一一对的结点一一对应时,称为完全二叉树。应时,称为完全二叉树。12311458912136710141512311458912671
10、01234567123456二叉树的存储结构二叉树的存储结构 顺序存储结构顺序存储结构:为了能够反映出结点之间的逻为了能够反映出结点之间的逻为了能够反映出结点之间的逻为了能够反映出结点之间的逻辑关系,必须将它辑关系,必须将它辑关系,必须将它辑关系,必须将它“修补修补修补修补”成完全二叉树,对应该完成完全二叉树,对应该完成完全二叉树,对应该完成完全二叉树,对应该完全二叉树,可以开辟长度为全二叉树,可以开辟长度为全二叉树,可以开辟长度为全二叉树,可以开辟长度为1212的数组,对的数组,对的数组,对的数组,对1212个数据元个数据元个数据元个数据元素进行存储,原二叉树中空缺的结点在数组中的相应素进行
11、存储,原二叉树中空缺的结点在数组中的相应素进行存储,原二叉树中空缺的结点在数组中的相应素进行存储,原二叉树中空缺的结点在数组中的相应单元必须置空单元必须置空单元必须置空单元必须置空 a a b b c c d d e e f f g g二叉树的存储结构二叉树的存储结构 链式存储结构链式存储结构:表示二叉树的链表中的结点应该表示二叉树的链表中的结点应该表示二叉树的链表中的结点应该表示二叉树的链表中的结点应该包含包含包含包含3 3 3 3个域:数据域和指向左、右子树的指针域,二叉树个域:数据域和指向左、右子树的指针域,二叉树个域:数据域和指向左、右子树的指针域,二叉树个域:数据域和指向左、右子树的
12、指针域,二叉树的这种存储结构被称为二叉链表。的这种存储结构被称为二叉链表。的这种存储结构被称为二叉链表。的这种存储结构被称为二叉链表。LchildLchilddatadatarchildrchild在n个结点的二叉链表中,有n+1个空指针域6.3 6.3 二叉树的遍历与线索化二叉树的遍历与线索化 二叉树的遍历:二叉树的遍历:是按某条搜索路径访问树是按某条搜索路径访问树中的每一个结点,使得每一个结点均被访中的每一个结点,使得每一个结点均被访问一次,而且仅被访问一次。问一次,而且仅被访问一次。先根遍历二叉树先根遍历二叉树 (1 1)访问根结点;)访问根结点;(2 2)先根遍历左子树;)先根遍历左子
13、树;(3 3)先根遍历右子树。)先根遍历右子树。中根遍历二叉树中根遍历二叉树(1 1)中根遍历左子树;)中根遍历左子树;(2 2)访问根结点;)访问根结点;(3 3)中根遍历右子树。)中根遍历右子树。后根遍历二叉树后根遍历二叉树 (1 1)后根遍历左子树;)后根遍历左子树;(2 2)后根遍历右子树;)后根遍历右子树;(3 3)访问根结点。)访问根结点。先根遍历先根遍历先根遍历先根遍历:-+a*bcd/ef:-+a*bcd/ef:-+a*bcd/ef:-+a*bcd/ef中根遍历中根遍历中根遍历中根遍历:a+b*cde/f:a+b*cde/f:a+b*cde/f:a+b*cde/f后根遍历后根遍
14、历后根遍历后根遍历:abcd-*+ef/-:abcd-*+ef/-:abcd-*+ef/-:abcd-*+ef/-typedef struct Node datatype data;struct Node*Lchild;struct Node*Rchild;BTnode,*Btree;先根遍历算法void preorder(Btree root)if(root!=NULL)Visit(root-data);preorder(root-Lchild);preorder(root-Rchild);中根遍历算法void InOrder(Btree root)if(root!=NULL)InOrder
15、(root-Lchild);Visit(root-data);InOrder(root-Rchild);后根遍历算法void PostOrder(Btree root)if(root!=NULL)PostOrder(root-Lchild);PostOrder(root-Rchild);Visit(root-data);线索二叉树:线索二叉树:利用二插链表剩余的利用二插链表剩余的n+1n+1个空个空指针域来存放遍历过程中结点的前驱和后继指针域来存放遍历过程中结点的前驱和后继的指针,这种附加的指针称为的指针,这种附加的指针称为“线索线索”,加,加上了线索的二叉链表称为线索链表,相应的上了线索的二
16、叉链表称为线索链表,相应的二叉树称为线索二叉树。二叉树称为线索二叉树。为了区分结点的指针域是指向其孩子的指为了区分结点的指针域是指向其孩子的指针,还是指向其前驱或后继的线索,可在二针,还是指向其前驱或后继的线索,可在二叉链表的结点中叉链表的结点中,再增设再增设2 2个标志域。个标志域。LchildLchildLchildLchildLtagLtagLtagLtagDataDataDataDataRtagRtagRtagRtagRchildRchildRchildRchild 0 Lchild 0 Lchild域指示结点的左孩子域指示结点的左孩子Ltag=Ltag=1 Lchild 1 Lchi
17、ld域指示结点的遍历前驱域指示结点的遍历前驱 0 0 RchildRchild域域指指示示结结点点的的右右孩孩子子Rtag=Rtag=1 Rchild 1 Rchild域指示结点的遍历后继域指示结点的遍历后继中序线索二叉树中序线索二叉树 基于遍历的应用与线索二叉树的应用基于遍历的应用与线索二叉树的应用 二叉树的遍历是对二叉树进行各种运算二叉树的遍历是对二叉树进行各种运算的一个重要基础,对访问(程序中的的一个重要基础,对访问(程序中的visitvisit函函数)结点可理解为各种对二叉树中结点进行数)结点可理解为各种对二叉树中结点进行操作。因此,只要将二叉树三种遍历算法中操作。因此,只要将二叉树三
18、种遍历算法中的的visitvisit函数具体化,就产生了基于二叉树的函数具体化,就产生了基于二叉树的不同应用。不同应用。输出二叉树中的结点输出二叉树中的结点 Void paintnode(Btree root)if(root!=NULL)printf(root-data);paintnode(root-Lchild);paintnode(root-Rchild);输出二叉树中的叶子结点输出二叉树中的叶子结点Void paintleaf(Btree root)if(root!=NULL)if(root-Lchild=NULL&root-Rchild=NULL)printf(root-data);
19、paintleaf(root-Lchild);paintleaf(root-Rchild);统计叶子结点数目统计叶子结点数目Void leafcount(Btree root)if(root!=NULL)leafcount(root-Lchild);leafcount(root-Rchild);if(root-Lchild=NULL&root-Rchild=NULL)count+;提示:提示:提示:提示:countcountcountcount为全局变量,在主函数中定义。为全局变量,在主函数中定义。为全局变量,在主函数中定义。为全局变量,在主函数中定义。建立二叉树建立二叉树图图图图中中中中二二
20、二二叉叉叉叉树树树树的的的的先先先先根根根根遍遍遍遍历历历历序序序序列列列列为为为为:ABDGCEHFABDGCEHFABDGCEHFABDGCEHF,而而而而考考考考虑虑虑虑空空空空子子子子树树树树后后后后的的的的先先先先根根根根遍遍遍遍历历历历序序序序列列列列应应应应为为为为:ABDABDABDABDG G G GCECECECEHFHFHFHF,其中其中其中其中“”代表空子树。代表空子树。代表空子树。代表空子树。如如如如果果果果已已已已知知知知二二二二叉叉叉叉树树树树的的的的考考考考虑虑虑虑了了了了空空空空子子子子树树树树后后后后的的的的遍遍遍遍历历历历序序序序列列列列,那那那那么么么么
21、建建建建立立立立这这这这棵棵棵棵二二二二叉叉叉叉树树树树的的的的算算算算法法法法如如如如下下下下(假假假假定定定定datatypedatatypedatatypedatatype类类类类型型型型为为为为char)char)char)char):Void CreateBtree(Btree*bt)char ch;ch=getchar();if(ch=.)*bt=NULL;else*bt=(Btree)malloc(sizeof(BTnode);(*bt)-data=ch;CreateBiTree(&(*bt)-Lchild);CreateBiTree(&(*bt)-Rchild);求二叉树的高度
22、求二叉树的高度采用递归的方法定义二叉树的高度:采用递归的方法定义二叉树的高度:采用递归的方法定义二叉树的高度:采用递归的方法定义二叉树的高度:(1 1 1 1)若二叉树为空,则高度为)若二叉树为空,则高度为)若二叉树为空,则高度为)若二叉树为空,则高度为0 0 0 0;(2 2 2 2)若二叉树非空,其高度应为其左右子树高度的最)若二叉树非空,其高度应为其左右子树高度的最)若二叉树非空,其高度应为其左右子树高度的最)若二叉树非空,其高度应为其左右子树高度的最大值加大值加大值加大值加1 1 1 1。int TreeDepth(Btree bt)int hl,hr,max;if(bt!=NULL)
23、hl=TreeDepth(bt-Lchild);hr=TreeDepth(bt-Rchild);max=(hl,hr);return(max+1);else return(0);在中根遍历的线索树中查找前驱结点在中根遍历的线索树中查找前驱结点 对于二叉树中任意结点对于二叉树中任意结点对于二叉树中任意结点对于二叉树中任意结点p p p p,要找其前驱结点,要找其前驱结点,要找其前驱结点,要找其前驱结点,当当当当p-Ltag=1p-Ltag=1p-Ltag=1p-Ltag=1时,时,时,时,p-Lchildp-Lchildp-Lchildp-Lchild即为即为即为即为p p p p的前驱结点;当
24、的前驱结点;当的前驱结点;当的前驱结点;当p-Ltag=0p-Ltag=0p-Ltag=0p-Ltag=0时,说明时,说明时,说明时,说明p p p p有左子树,此时有左子树,此时有左子树,此时有左子树,此时p p p p的中根遍历下的前驱结点即为其左子树的中根遍历下的前驱结点即为其左子树的中根遍历下的前驱结点即为其左子树的中根遍历下的前驱结点即为其左子树右链下的最后一个结点。右链下的最后一个结点。右链下的最后一个结点。右链下的最后一个结点。Void Previous(ThreadTnode*p,ThreadTnode*pre)ThreadTnode*q;if(p-Ltag=1)pre=p-L
25、child;else for(q=p-Lchild;q-Rtag=0;q=q-Rchild);pre=q;在中根遍历的线索树中查找后继结点在中根遍历的线索树中查找后继结点 二叉树中任意结点二叉树中任意结点二叉树中任意结点二叉树中任意结点p p p p,若要找其后继结点,当,若要找其后继结点,当,若要找其后继结点,当,若要找其后继结点,当p-Rtag=1p-Rtag=1p-Rtag=1p-Rtag=1时,时,时,时,p-Rchildp-Rchildp-Rchildp-Rchild即为即为即为即为p p p p的后继结点;当的后继结点;当的后继结点;当的后继结点;当p-Rtag=0p-Rtag=0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构-C语言描述 数据结构 语言 描述
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内