《树与二叉树 》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)的结点,它只有直接后继,但没有直接前驱;当n 1,除根以外的其它结点划分为 m(m 0)个互不相交的有限集 T1,T2,Tm,其中每个集合本身又是一棵树,并且称为根的子树(SubTree)。,根,子树,特点:树中至少有一个结点根 树中各子树是互不相交的集合
2、,二、树的表示,1树形结构表示法,2.凹入法表示法,3.嵌套集合表示法(文氏图表示法),4.广义表表示法(括号表现法)对树结构,广义表表示法可表示为:(A(B(E(J,K,L),F),C(G),D(H(M),I),分支(branch):结点之间的二元关系(序偶)。结点(node):一个数据元素及指向其子树的分支。结点的度(degree):结点拥有的子树个数。叶结点(leaf):度为零的结点。分支结点(branch node):有后继的结点称为分支结点。儿子(sons):结点x的子树的根。父亲(parent):结点x的前驱结点称为x的父亲。兄弟(brother):同一父亲的结点的子女结点。祖先(
3、ancestor):根到该结点路径上的所有结点。子孙(descendant):某结点为根的子树上的任意结点。堂兄弟(cousin):父亲是兄弟关系或堂兄弟关系的结点。,结点层次(level):从根开始,根为第一层,根的子女为第二层,以此类推。树的深度(高度)(depth):树中结点的最大层次数树的度:一棵树中最大的结点度数。结点按层编号(层中编号):将树中结点按从上层到下层,同层从左到右的次序排成一个线性序列,依次给他们编以连续的自然数。祖辈(上层):层号比结点x小的结点,称为x的祖辈。后辈(下层):层号比结点x大的结点,称为x的后辈。有序树:若一棵树中所有子树从左到右的排序是有顺序的,不能颠
4、倒次序。称该树为有序树。无序树:若一棵树中所有子树的次序无关紧要,则称为无序树。森林(forest):m(m 0)棵互不相交的树。,三、树的基本术语,1层,2层,4层,3层,height=4,A,C,G,B,D,E,F,K,L,H,M,I,J,结点结点的度叶结点分支结点,子女双亲兄弟,祖先子孙结点层次,树的深度树的度有序树无序树森林,结点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,
5、G为堂兄弟结点A是结点F,G的祖先,8.2 二叉树(Binary Tree),定义:,五种形态:,一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。,特点:,每个结点至多只有两棵子树(二叉树中不存在度大于2的结点),二叉树的基本操作,(1)creat_tree(bt,str)根据二叉树的括号表示法str建立一棵二叉树bt。(2)disptree(bt)以凹入法显示一棵二叉树bt。(3)depth_bttree(bt)求一棵二叉树bt的深度。(4)count_bttree(bt)求一棵二叉树bt的结点个数。(5)leafco
6、unt_bttree(bt)求一棵二叉树bt的叶子结点个数。(6)nleafcount_bttree(bt)求一棵二叉树bt 的非叶子结点个数。,性质1 在二叉树的第 i 层上至多有 2i 1个结点。(i 1)证明用归纳法证明:当i=1时,只有根结点,2 i-1=2 0=1。假设对所有j,ij1,命题成立,即第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)。证明:由性
7、质1可见,深度为k的二叉树的最大结点数为,性质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个结点的二叉树称为满二叉树。,两种特殊形态的二叉树,非完全二叉树,定义2 完全二叉树(Complete Binary Tree)若设二叉树的高度为h,则共有h层。除第 h 层外,其它
8、各层(0 h-1)的结点数都达到最大个数,第 h 层从右向左连续缺若干结点,这就是完全二叉树。,完全二叉树,性质4 具有 n(n 0)个结点的完全二叉树的深度为log2(n)1 证明:设完全二叉树的深度为 h,则根据性质2和完全二叉树的定义有2h1-1 n 2h-1或 2h1 n 2h取对数 h1 log2n h,又h是整数,因此有 h=log2(n)1,性质5 如将一棵有n个结点的完全二叉树自顶向下,同一层自左向右连续给结点编号 1,2,n,则有以下关系:若i=1,则 i 无双亲若i 1,则 i 的双亲为(i/2)若2*i n,则 i 无左孩子,否则其左孩子是结点2i.若2*i+1n,则结点
9、i无右孩子,否则其右孩子为结点2*i+1,完全二叉树 一般二叉树的顺序表示 的顺序表示,8.3 二叉树的存储结构,一、顺序表示,二、链表表示,二叉树链表表示的示例,二叉树 二叉链表 三叉链表,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个。,三、二叉链表的递归创建及其基本操作的实现,
10、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 二叉树遍历,树的遍历就是按某种次序访问树中的结点,要求每个结点访问一次且仅访问一次。设访问根结点记作 V 遍历根的左子树记
11、作 L 遍历根的右子树记作 R 则可能的遍历次序有 前序 VLR 中序 LVR 后序 LRV,中序遍历二叉树算法的定义:若二叉树为空,则空操作;否则中序遍历左子树(L);访问根结点(V);中序遍历右子树(R)。遍历结果 a+b*c-d-e/f,中序遍历(Inorder Traversal),void inorder(bitree bt)if(bt!=NULL)inorder(bt-lchild);printf(“%c”,bt-data);inorder(bt-rchild);,中序遍历二叉树的递归算法,前序遍历二叉树算法的定义:若二叉树为空,则空操作;否则访问根结点(V);前序遍历左子树(L)
12、;前序遍历右子树(R)。遍历结果-+a*b-c d/e f,前序遍历(Preorder Traversal),前序遍历二叉树的递归算法void preorder(bitree bt)if(bt!=NULL)printf(“%c”,bt-data);preorder(bt-lchild);preorder(bt-rchild);,后序遍历二叉树算法的定义:若二叉树为空,则空操作;否则后序遍历左子树(L);后序遍历右子树(R);访问根结点(V)。遍历结果 a b c d-*+e f/-,后序遍历(Postorder Traversal),后序遍历二叉树的递归算法:void postorder(bi
13、tree bt)if(bt!=NULL)postorder(bt-lchild);postorder(bt-rchild);printf(“%c”,bt-data);,非递归实现先序遍历二叉树 利用一个一维数组作为栈,来存储二叉链表中结点,算法思想为:1、从二叉树根结点开始,先将根结点入栈。2、然后将栈顶结点出栈,输出结点的值,同时判断该结点有没有右子树,有则将右子树的根结点入栈;再判断有没有左子树,有则将左子树的根结点入栈。如果栈不空则重复第2步,直到栈为空。,void preorder(bitree root)bitree p,stack100;int top=-1;/top为栈顶指针 i
14、f(root!=NULL)top+;stacktop=root;/将根结点压入栈内 while(top!=-1)p=stacktop;top-;printf(“%d”,p-data);if(p-rchild!=NULL)stack+top=p-rchlid;/压右子树 if(p-lchild!=NULL)stack+top=p-lchild;/压左子树,非递归实现中序遍历二叉树 同样利用一个一维数组作栈,来存贮二叉链表中结点,算法思想为:1、将所指的结点的左子树入栈,其下面的左子树也入栈2、弹出一个结点并输出,判断其是否有右子树,有则入栈,再转到第1步,没有右子树则判断栈是否为空,不空则弹出一
15、个结点,转回第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);,非递归实现后序遍历二叉树 在后序遍历中,当搜索指针指向某一个结点时,不能马上进行访问,而先要遍历左子树,所以此结点应先进栈保存,当遍历完它的左子树后,再次回到该结点,还不能
16、访问它,还需先遍历其右子树,所以该结点还必须再次进栈,只有等它的右子树遍历完后,再次退栈时,才能访问该结点。为了区分同一结点的三次进栈及出栈,引入一个栈次数的标志,一个元素第一次进栈标志为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+;/将根结点入栈,wh
17、ile(top!=0)top-;p=stacktop;if(p.treenode!=NULL)if(p.sign=1)q.treenode=p.treenode;q.sign=2;stacktop+=q;q.treenode=p.treenode-lchild;q.sign=1;stacktop+=q;if(p.sign=2)q.treenode=p.treenode;q.sign=3;stacktop+=q;q.treenode=p.treenode-rchild;q.sign=1;stacktop+=q;if(p.sign=3)printf(“%dt”,p.treenode-data);,
18、线索二叉树的引入:对二叉树遍历的过程实质上是对一个非线性结构进行线性化的操作。以二叉链表为存储结构时,结点的左右孩子可以直接找到,但不能直接找到结点的前驱和后继,而结点的前驱和后继只有在遍历二叉树的过程中才能得到。用二叉链表表示的二叉树中,n个结点的二叉树有n+1个空链域,可利用这些空链域存储结点的前驱或后继。,8.5 线索二叉树(Threaded Binary Tree),ltag=0,lchild为左孩子指针ltag=1,lchild为前驱线索rtag=0,rchild为右孩子指针rtag=1,rchild为后继线索,typedef struct bithrnode elemtype da
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 树与二叉树 树与二叉树 PPT课件 二叉 PPT 课件
链接地址:https://www.31ppt.com/p-5532550.html