《树与二叉树 》PPT课件.ppt
《《树与二叉树 》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《树与二叉树 》PPT课件.ppt(87页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第八章第八章 树与二叉树树与二叉树1.树的定义及其基本概念树的定义及其基本概念2.二叉树的基本概念和存储结构二叉树的基本概念和存储结构3.二叉树的遍历二叉树的遍历4.线索二叉树的概念及其遍历线索二叉树的概念及其遍历6.哈夫曼树及其构造方法哈夫曼树及其构造方法7.树与森林树与森林5.二叉排序树二叉排序树8.1 树的概念和基本术语树的概念和基本术语一、树的定义一、树的定义 树是由树是由 n(n 0)个结点的有限集合。如果个结点的有限集合。如果 n=0,称为空树;如果,称为空树;如果 n 0,则,则 有且仅有一个特定的称之为根有且仅有一个特定的称之为根(Root)的结的结点,它只有直接后继,但没有直
2、接前驱;点,它只有直接后继,但没有直接前驱;当当n 1,除根以外的其它结点划分为,除根以外的其它结点划分为 m(m 0)个互不相交的有限集个互不相交的有限集 T1,T2,Tm,其中每个集合本身又是一棵树,并且称为根其中每个集合本身又是一棵树,并且称为根的子树的子树(SubTree)。A只有根结点的树只有根结点的树ABCDEFGHIJKLM有子树的树有子树的树根根子子树树空树空树特点:树中至少有一个结点特点:树中至少有一个结点根根 树中各子树是互不相交的集合树中各子树是互不相交的集合二、树的表示二、树的表示1树形结构表示法树形结构表示法 2.凹入法表示法凹入法表示法3.嵌套集合表示法(文氏图表示
3、法)嵌套集合表示法(文氏图表示法)4.广义表表示法(括号表现法)广义表表示法(括号表现法)对树结构,广义表表示法可表示为:对树结构,广义表表示法可表示为:(A(B(E(J,K,L),F),C(G),D(H(M),I)分支分支(branch):结点之间的二元关系(序偶)。:结点之间的二元关系(序偶)。结点结点(node):一个数据元素及指向其子树的分支。:一个数据元素及指向其子树的分支。结点的度结点的度(degree):结点拥有的子树个数。:结点拥有的子树个数。叶结点叶结点(leaf):度为零的结点。:度为零的结点。分支结点分支结点(branch node):有后继的结点称为分支结点。有后继的结
4、点称为分支结点。儿子儿子(sons):结点:结点x的子树的根。的子树的根。父亲父亲(parent):结点结点x的前驱结点称为的前驱结点称为x的父亲。的父亲。兄弟兄弟(brother):同一父亲的结点的子女结点。:同一父亲的结点的子女结点。祖先祖先(ancestor):根到该结点路径上的所有结点。:根到该结点路径上的所有结点。子孙子孙(descendant):某结点为根的子树上的任意结点。:某结点为根的子树上的任意结点。堂兄弟堂兄弟(cousin):父亲是兄弟关系或堂兄弟关系的结点。父亲是兄弟关系或堂兄弟关系的结点。结点层次结点层次(level):从根开始,根为第一层,根的子女为:从根开始,根为
5、第一层,根的子女为第二层,以此类推。第二层,以此类推。树的深度(高度)树的深度(高度)(depth):树中结点的最大层次数:树中结点的最大层次数树的度树的度:一棵树中最大的结点度数。:一棵树中最大的结点度数。结点按层编号(层中编号)结点按层编号(层中编号):将树中结点按从上层到下:将树中结点按从上层到下层,同层从左到右的次序排成一个线性序列,依次给层,同层从左到右的次序排成一个线性序列,依次给他们编以连续的自然数。他们编以连续的自然数。祖辈(上层):祖辈(上层):层号比结点层号比结点x小的结点,称为小的结点,称为x的祖辈。的祖辈。后辈(下层):后辈(下层):层号比结点层号比结点x大的结点,称为
6、大的结点,称为x的后辈。的后辈。有序树有序树:若一棵树中所有子树从左到右的排序是有顺序:若一棵树中所有子树从左到右的排序是有顺序的,不能颠倒次序。称该树为有序树。的,不能颠倒次序。称该树为有序树。无序树无序树:若一棵树中所有子树的次序无关紧要,则称为:若一棵树中所有子树的次序无关紧要,则称为无序树。无序树。森林森林(forest):m(m 0)棵互不相交的树。棵互不相交的树。三、树的基本术语三、树的基本术语1层2层4层3层height=4ACGBDEFKLHMIJ结点结点结点的度结点的度叶结点叶结点分支结点分支结点子女子女双亲双亲兄弟兄弟祖先祖先子孙子孙结点层次结点层次树的深树的深度度树的度树
7、的度有序树有序树无序树无序树森林森林ABCDEFGHIJKLM结点结点A的度:的度:3结点结点B的度:的度:2结点结点M的度:的度:0叶子:叶子:K,L,F,G,M,I,J结点结点A的孩子:的孩子:B,C,D结点结点B的孩子:的孩子:E,F结点结点I的父亲:的父亲:D结点结点L的父亲:的父亲:E结点结点B,C,D为兄弟为兄弟结点结点K,L为兄弟为兄弟树的度:树的度:3结点结点A的层次:的层次:1结点结点M的层次:的层次:4树的深度:树的深度:4结点结点F,G为堂兄弟为堂兄弟结点结点A是结点是结点F,G的祖先的祖先8.2 二叉树二叉树(Binary Tree)定义定义:五种形态五种形态:一棵二叉
8、树是结点的一个有限集合,该一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根结点加集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树的、互上两棵分别称为左子树和右子树的、互不相交的二叉树组成。不相交的二叉树组成。LLRR特点特点:每个结点至多只有两棵子树(二叉树中每个结点至多只有两棵子树(二叉树中不存在度大于不存在度大于2的结点)的结点)二叉树的基本操作二叉树的基本操作(1)creat_tree(bt,str)根据二叉树的括号表示法根据二叉树的括号表示法str建立一棵二叉树建立一棵二叉树bt。(2)disptree(bt)以凹入法显示一棵二叉树以凹入法显示一棵二叉树bt
9、。(3)depth_bttree(bt)求一棵二叉树求一棵二叉树bt的深度。的深度。(4)count_bttree(bt)求一棵二叉树求一棵二叉树bt的结点个数。的结点个数。(5)leafcount_bttree(bt)求一棵二叉树求一棵二叉树bt的叶子结点个数。的叶子结点个数。(6)nleafcount_bttree(bt)求一棵二叉树求一棵二叉树bt 的非叶子结点个数。的非叶子结点个数。性质性质1 在二叉树的第在二叉树的第 i 层上至多有层上至多有 2i 1个结个结点。点。(i 1)证明用归纳法证明用归纳法证明:当证明:当i=1时,只有根结点,时,只有根结点,2 i-1=2 0=1。假设对
10、所有假设对所有j,ij 1,命题成立,即第,命题成立,即第j层上层上至多有至多有2 j-1 个结点。个结点。由归纳假设第由归纳假设第i-1 层上至多有层上至多有 2i 2个结点。个结点。由于二叉树的每个结点的度至多为由于二叉树的每个结点的度至多为2,故在第,故在第i层上的最大结点数为第层上的最大结点数为第i-1层上的最大结点数层上的最大结点数的的2倍,即倍,即2*2i 2=2 i-1。二叉树的性质二叉树的性质性质性质2 深度为深度为 k 的二叉树至多有的二叉树至多有 2k-1个个结点结点(k 1)。证明:由性质证明:由性质1可见,深度为可见,深度为k的二叉树的最的二叉树的最大结点数为大结点数为
11、 20+21+2k-1=2k-1性质性质3 对任何一棵二叉树对任何一棵二叉树T,如果其叶结如果其叶结点数为点数为 n0,度为度为2的结点数为的结点数为 n2,则则n0n21.证明:若度为证明:若度为1的结点有的结点有 n1 个,总结点个数个,总结点个数为为 n,总边数为,总边数为 e,则根据二叉树的定义,则根据二叉树的定义,n=n0+n1+n2 e=2n2+n1=n-1因此,有因此,有 2n2+n1=n0+n1+n2-1 n2=n0-1 n0=n2+1 定义定义1 满二叉树满二叉树(Full Binary Tree)一棵深度为一棵深度为k且有且有2k-1个结点的二叉树称为个结点的二叉树称为满二
12、叉树。满二叉树。两种特殊形态的二叉树两种特殊形态的二叉树621754389 10 1113 14 1512满二叉树满二叉树215436 7216543非完全二叉树非完全二叉树定义定义2 完全二叉树完全二叉树(Complete Binary Tree)若设二叉树的高度为若设二叉树的高度为h,则共有,则共有h层。除第层。除第 h 层外,其它各层层外,其它各层(0 h-1)的结点数都达到的结点数都达到最大个数,第最大个数,第 h 层从右向左连续缺若干结点,层从右向左连续缺若干结点,这就是完全二叉树。这就是完全二叉树。621754389 10 11 12完全二叉树完全二叉树性质性质4 具有具有 n(n
13、 0)个结点的完全二叉个结点的完全二叉树的深度为树的深度为 log2(n)1 证明:证明:设完全二叉树的深度为设完全二叉树的深度为 h,则根据性,则根据性质质2和完全二叉树的定义有和完全二叉树的定义有2h1-1 n 2h-1或或 2h1 n 2h取对数取对数 h1 1,则则 i 的双亲为的双亲为(i/2)若若2*i n,则则 i 无左孩子无左孩子,否则其左孩子是结点否则其左孩子是结点2i.若若2*i+1n,则结点则结点i无右孩子无右孩子,否则其右孩子为结点否则其右孩子为结点2*i+118234567910完全二叉树完全二叉树 一般二叉树一般二叉树的顺序表示的顺序表示 的顺序表示的顺序表示8.3
14、 二叉树的存储结构二叉树的存储结构11 2 3 4 5 6 7 8 9102489 105673一、顺序表示一、顺序表示91 2 3 4 0 5 6 7 8 0 0 0 0 9 10 123654789 10二、链表表示二、链表表示datalChildrChild二叉链表二叉链表lChild data rChild含两个指针域的结点结构含两个指针域的结点结构lChild data parent rChild含三个指针域的结点结构含三个指针域的结点结构parentdatalChildrChild三叉链表三叉链表二叉树链表表示的示例二叉树链表表示的示例ABCDFEroot ABCDFEroot A
15、BCDFEroot二叉树二叉树 二叉链表二叉链表 三叉链表三叉链表typedef struct btnode struct btnode*lchild;int data;struct btnode*rchild;bitnode,*bitree;二叉链表的定义二叉链表的定义若一个二叉树含有若一个二叉树含有n个结点,则它的二叉链表中必个结点,则它的二叉链表中必含有含有2n个指针域,其中必有个指针域,其中必有n+1个空链域。个空链域。证明:边数证明:边数e=n-1;即非空链域为即非空链域为n-1个,则空链域为个,则空链域为2n-(n-1)=n+1个。个。三、二叉链表的递归创建及其基本操作的实现三、二
16、叉链表的递归创建及其基本操作的实现 char s=,a,b,c,d,e,f,g,h,I;root=creat_tree(s,1);bitree creat_tree(char*s,int p)bitree new;if(sp=|p15)return NULL;else new=(bitree)malloc(sizeof(bitree);new-data=sp;new-lchild=creat_tree(s,2*p);new-rchile=creat_tree(s,2*p+1);return new;8.4 二叉树遍历二叉树遍历树的遍历就是按某种次序访问树中的结点,树的遍历就是按某种次序访问树中
17、的结点,要求每个结点访问一次且仅访问一次。要求每个结点访问一次且仅访问一次。设访问根结点记作设访问根结点记作 V 遍历根的左子树记作遍历根的左子树记作 L 遍历根的右子树记作遍历根的右子树记作 R 则可能的遍历次序有则可能的遍历次序有 前序前序 VLR 中序中序 LVR 后序后序 LRV VLR中序遍历二叉树算法的定义:中序遍历二叉树算法的定义:若二叉树为空,则空操作;若二叉树为空,则空操作;否则否则中序遍历左子树中序遍历左子树(L);访问根结点访问根结点(V);中序遍历右子树中序遍历右子树(R)。遍历结果遍历结果 a+b*c-d-e/f中序遍历中序遍历(Inorder Traversal)-
18、/+*abcdefvoid inorder(bitree bt)if(bt!=NULL)inorder(bt-lchild);printf(“%c”,bt-data);inorder(bt-rchild);中序遍历二叉树的递归算法中序遍历二叉树的递归算法-/+*abcdef前序遍历二叉树算法的定义:前序遍历二叉树算法的定义:若二叉树为空,则空操作;若二叉树为空,则空操作;否则否则访问根结点访问根结点(V);前序遍历左子树前序遍历左子树(L);前序遍历右子树前序遍历右子树(R)。遍历结果遍历结果-+a*b-c d/e f前序遍历前序遍历(Preorder Traversal)-/+*abcdef
19、前序遍历二叉树的递归算法前序遍历二叉树的递归算法void preorder(bitree bt)if(bt!=NULL)printf(“%c”,bt-data);preorder(bt-lchild);preorder(bt-rchild);-/+*abcdef后序遍历二叉树算法的定义:后序遍历二叉树算法的定义:若二叉树为空,则空操作;若二叉树为空,则空操作;否则否则后序遍历左子树后序遍历左子树(L);后序遍历右子树后序遍历右子树(R);访问根结点访问根结点(V)。遍历结果遍历结果 a b c d-*+e f/-后序遍历后序遍历(Postorder Traversal)-/+*abcdef后序
20、遍历二叉树的递归算法:后序遍历二叉树的递归算法:void postorder(bitree bt)if(bt!=NULL)postorder(bt-lchild);postorder(bt-rchild);printf(“%c”,bt-data);-/+*abcdef非递归实现先序遍历二叉树非递归实现先序遍历二叉树 利用一个一维数组作为栈,来存储二叉链表利用一个一维数组作为栈,来存储二叉链表中结点,算法思想为:中结点,算法思想为:1、从二叉树根结点开始,先将根结点入栈。、从二叉树根结点开始,先将根结点入栈。2、然后将栈顶结点出栈,输出结点的值,同、然后将栈顶结点出栈,输出结点的值,同时判断该结
21、点有没有右子树,有则将右子树时判断该结点有没有右子树,有则将右子树的根结点入栈;再判断有没有左子树,有则的根结点入栈;再判断有没有左子树,有则将左子树的根结点入栈。如果栈不空则重复将左子树的根结点入栈。如果栈不空则重复第第2步,直到栈为空。步,直到栈为空。void preorder(bitree root)bitree p,stack100;int top=-1;/top为栈顶指针为栈顶指针 if(root!=NULL)top+;stacktop=root;/将根结点压入栈内将根结点压入栈内 while(top!=-1)p=stacktop;top-;printf(“%d ”,p-data);
22、if(p-rchild!=NULL)stack+top=p-rchlid;/压右子树压右子树 if(p-lchild!=NULL)stack+top=p-lchild;/压左子树压左子树 非递归实现中序遍历二叉树非递归实现中序遍历二叉树 同样利用一个一维数组作栈,来存贮二叉链同样利用一个一维数组作栈,来存贮二叉链表中结点,算法思想为:表中结点,算法思想为:1、将所指的结点的左子树入栈,其下面的左、将所指的结点的左子树入栈,其下面的左子树也入栈子树也入栈2、弹出一个结点并输出,判断其是否有右子、弹出一个结点并输出,判断其是否有右子树,有则入栈,再转到第树,有则入栈,再转到第1步,没有右子树则步,
23、没有右子树则判断栈是否为空,不空则弹出一个结点,转判断栈是否为空,不空则弹出一个结点,转回第回第2步,为空则结束。步,为空则结束。void inorder(bitree root)bitree p=root,stack100;/s为一个栈,为一个栈,top为栈顶指针为栈顶指针 int top=-1;do while(p!=NULL)top+;stacktop=p;p=p-lchild;if(top=0)p=stacktop;top-;printf(“%d ”,p-data);p=p-rchild;while(p!=NULL|top=0);非递归实现后序遍历二叉树非递归实现后序遍历二叉树 在后序
24、遍历中,当搜索指针指向某一个结在后序遍历中,当搜索指针指向某一个结点时,不能马上进行访问,而先要遍历左子点时,不能马上进行访问,而先要遍历左子树,所以此结点应先进栈保存,当遍历完它树,所以此结点应先进栈保存,当遍历完它的左子树后,再次回到该结点,还不能访问的左子树后,再次回到该结点,还不能访问它,还需先遍历其右子树它,还需先遍历其右子树,所以该结点还必须所以该结点还必须再次进栈,只有等它的右子树遍历完后,再再次进栈,只有等它的右子树遍历完后,再次退栈时,才能访问该结点。次退栈时,才能访问该结点。为了区分同一结点的三次进栈及出栈,引为了区分同一结点的三次进栈及出栈,引入一个栈次数的标志,一个元素
25、第一次进栈入一个栈次数的标志,一个元素第一次进栈标志为标志为1,第二次进标志为,第二次进标志为2,第三次进栈标,第三次进栈标志为志为3,并将标志同时存入栈中,当出栈的元,并将标志同时存入栈中,当出栈的元素的标志为素的标志为3时,才输出此结点。时,才输出此结点。struct forpost int sign;bitnode*treenode;void postorder(bitnode *root)forpost stack100,p,q;int top=0,i;p.treenode=root;p.sign=1;stacktop=p;top+;/将根结点入栈将根结点入栈while(top!=0)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 树与二叉树 树与二叉树 PPT课件 二叉 PPT 课件
限制150内