资源描述
单击此处编辑母版标题样式,第五章 树,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第五章 树,第五章目录,5.1 树的定义和基本术语,5.2 二叉树,5.3 二叉树的遍历,5.4 线索二叉树,5.5 树的应用,5.6 应用实例及分析,小 结,习题与练习,第五章 树,5.1.1,树的定义,树是n个结点的有限集合T,在一棵非空树中(n0)有且仅有一个称作根的结点;其余结点可分为m个(m0)互不相交的集合T,1,,T,2,T,m,,其中,每一个集合本身又是一棵树,并称为根的子树。,当n=0时,称为空树。,有限集合T,1,,T,2,T,m,应该“互不相交”,即任意两个集合不能有相重的结点。,树的各个结点有不同层次关系,这种关系通常用图形表示,但与自然界的树木相反,习惯上将整棵树的根画在最上层,如图5.1所示。,第五章 树,图5.1 树的表示法,第五章 树,5.1.2,基本术语,1.结点的度:树中每个结点具有的子树数或者后继结点数称为该结点的度(Degree)。度数为0的结点,即没有子树的结点叫作端结点或叶子结点。一棵树中各个结点度数的最大值叫做这个树的度。,2.儿子结点和父亲结点:一个结点的子树的根或者后继结点称为该结点的儿子结点,反之,该结点则称为其后继结点的父亲结点。,3.兄弟结点:同一个结点的儿子结点之间互称为兄弟结点。,第五章 树,4.子孙结点和祖先结点:一个结点的子树中所有结点均称之为该结点的子孙结点。反之,从根结点到达一个结点的路径上的所有结点,都叫做该结点的祖先结点。,5.树的深度:树是一种层次结构,树中结点的层次(Level)是从根结点算起的。根结点为第一层,其儿子结点为第二层。其余各结点的层数逐层由上而下计算。一棵树中结点的最大层数叫做此树的深度或高度。,6.森林:n个树的集合叫森林(Forest)。,第五章 树,树形结构的逻辑特征,树形结构的逻辑特征可用树中结点之间的父子关系来描述:,树中任一结点都可以有零个或多个直接后继结点(即儿子结点),但至多只能有一个直接前趋结点(即父亲结点)。,树中只有根结点无前趋,它是开始结点;,叶结点无后继,它们是终端结点。,树形结构是非线性结构。,返回,第五章 树,5.2.1,二叉树的定义及其性质,一个二叉树是n个结点的有限集合(n0),此集合或者是空集(n=0),或者是由一个根结点及两棵互不相交的、分别称为左子树和右子树的二叉树组成。,由上述定义可知,二叉树可以是空集,其根可以有空的左子树或右子树,或者左、右子树皆为空。,一般地,二叉树有五种基本形态,如图5.2所示。,第五章 树,图5.2 二叉树的基本形态,(a)空二叉树,(b)仅有一个根结点的二叉树,(c)右子树为空的二叉树,(d)左子树为空的二叉树,(e)左、右子树均非空的二叉树,第五章 树,1.,满二叉树,在一个二叉树中,若第i层的结点数为2,i-1,,则称此层的结点数是满的,当树中的每一层都是满的,则称此二叉树为满二叉树。,即如果一个二叉树中,除最下一层的各结点度数为0以外,其它各层结点的度数均等于2,则此二叉树为满二叉树。,满二叉树的第一层有一个结点(即根结点),第二层有两个结点,依此类推。每一层的结点数都是上一层结点数的二倍。所以,在满二叉树的第i层共有2,i-1,个结点(i1),一个深度为h的满二叉树的结点总数为2,h,-1。,第五章 树,图5.3 满二叉树,第五章 树,2.,完全二叉树,如果一个二叉树各层都是“满”的,只是最下面一层从右边起连续缺n个结点,这种二叉树叫做完全二叉树。,例如图5.3中的满二叉树,如果缺少从第11号至第15号结点(没有图中虚框里的几个结点),就是一个完全二叉树。,设完全二叉树的结点数为n,它与树的深度之间的关系为:,2,h-1,-11,则其父结点编号为 。,2)如果2in,则其左儿子结点编号为2i;若2in,则无左儿子结点。,3)如果(2i+1)n,则其右儿子结点编号为(2i+1);反之,则无右儿子结点。,第五章 树,5.2.2,二叉树的存储结构,1.二叉树的顺序存储结构:用一个一维数组来存储二叉树的各个结点,显然,二叉树的结点必须按某种次序分别存入数组的各个单元,这种次序应能反映结点间的逻辑关系,否则二叉树上的各种基本运算在顺序存储结构上很难实现。,对于完全二叉树来说,可以采用“以编号为地址”的方法,将编号为i的结点存入一维数组的第i个单元。,图5.3所示的完全二叉树按此方法存入数组中如下图5.4所示。,第五章 树,图,5.4 二叉树的顺序存储结构,这种存储结构适用于完全二叉树和满二叉树。,如果某二叉树不是完全二叉树,中间有一些结点不存在,则采用顺序存储结构时,数组中必然要有一些空闲单元,对存储空间利用不够。,第五章 树,图5.5 非完全二叉树的顺序表示,第五章 树,图5.5中的二叉树,采用顺序存储结构时,一维数组的21单元中只用上了7个。,2.二叉树的链式存储结构:对于这种非完全二叉树,采用链式存储结构更合适,如图5.6所示。,第五章 树,第五章 树,结点结构,通常每个结点中设置三个域,即值域、左指针域和右指针域,其结点结构如下:,其中data表示值域,用于存储放入结点的数据,left和right分别表示左指针域和右指针域,用以分别存储指向左儿子结点和右儿子结点的指针。,第五章 树,结点定义,链式存储结构的结点定义如下:,typedef struct bnode,ElemType data;,struct bnode*left,*right;,btree;,这里的ElemType可以是任何相应的数据类型如int、float或char等。,第五章 树,5.2.3,普通树与二叉树的转换,普通树可用链式存储结构来表示,每个结点包括数据域以及指向它各个儿子结点的指针域。,由于同一树的各结点度数一般并不相同,如按结点的度数给每个结点设置不同数目的指针域,不同结点的数据结构不同,会给算法设计和程序编制造成困难。,如欲令同一树的各结点有相同数据结构,则只能按结点度数最大值(该树的度数)给每个结点设置指针。这样较浪费存储空间。,按照一定的原则将普通树用二叉树来表示,是较好的表示方法。,第五章 树,要把普通树转换为二叉树,就必须找到一种结点与结点之间至多用两个量说明的关系:树中每个结点最多只有一个最左边的儿子结点和一个右邻的兄弟结点。,按照这种关系可以把普通树转换成相应的二叉树,具体方法如下:,1)在所有兄弟结点之间加一连线;,2)对每个结点,除了保留与其左儿子结点的连线外,去掉该结点与其它儿子结点的连线。,第五章 树,图5.8 树转化为二叉树,图中所示的树经过变换,可得下面的形式。,第五章 树,得到的已是一棵二叉树,若按顺时针方向将它旋转就更清楚地变为下面所示的二叉树。,第五章 树,由于树根没有兄弟,所以树转换为二叉树后,二叉树的根结点的右子树必为空。,返回,第五章 树,5.3.1,二叉树的遍历,二叉树的遍历(Traversal)是指按一定的规律访问二叉树的每个结点,且每个结点只被访问一次的过程。,对二叉树的遍历过程实际上是将非线性结构的二叉树中的结点排列成一个线性序列的过程。,对于用顺序法表示的二叉树,各结点在数组中的编号很有规律,其遍历较容易进行,但对于用链式存储结构表示的二叉树,进行遍历就复杂一些,故本节仅讨论链式存储形式的二叉树遍历过程。,第五章 树,一个非空的二叉树由根结点及左、右子树这三个基本部分组成,因此若能依次遍历这三部分,便是遍历了整个二叉树。,在任一给定结点上,可以按某种次序执行三个操作:访问结点本身,遍历该结点左子树,遍历该结点右子树,操作排列次序:,左、根、右;根、左、右;左、右、根;,右、根、左;根、右、左;右、左、根;,由于实际问题一般都是要求左子树较右子树先遍历,故只采用其中、三种遍历次序,分别称为中序遍历、先序遍历和后序遍历。,第五章 树,三种遍历次序以递归的形式定义:,(1)中序(Inorder)遍历,若遍历的二叉树为空,执行空操作;否则依次执行下列操作:,中序遍历左子树;,访问根结点;,中序遍历右子树。,(2)先序(Preorder)遍历,若遍历的二叉树为空,执行空操作;否则依次执行下列操作:,访问根结点;,先序遍历左子树;,先序遍历右子树。,第五章 树,(3)后序(Postorder)遍历,若遍历的二叉树为空,执行空操作;否则依次执行下列操作:,后序遍历左子树;,后序遍历右子树;,访问根结点。,第五章 树,图5.9 二叉树遍历,中序遍历序列:H,D,I,B,E,A,F,C,G。,先序遍历序列:A,B,D,H,I,E,C,F,G。,后序遍历序列:H,I,D,E,B,F,G,C,A。,第五章 树,中序遍历递归算法,void inorder(btree*p),if(p!=NULL),inorder(p-left);,printf(%d,p-data);,inorder(p-right);,第五章 树,5.3.2,二叉树的非递归遍历,可利用堆栈将递归算法改写成非递归的形式。下面以先序遍历为例来具体说明。,图示为二叉树上的任一结点X,以及它的左子树X,L,和右子树X,R,。假设t是指向结点X的指针。,第五章 树,非递归先序遍历二叉树上任一结点X的主要操作:,(1)访问结点X;,(2)结点X的右指针进栈;,(3)若X,L,不空,沿X的左指针遍历X,L,;,(4)从栈中取出X的右指针;,(5)若X,R,不空,沿X的右指针遍历X,R,。,第五章 树,先序遍历的非递归算法,void preorder(btree*t),btree stackstacksize;/*定义栈*/,int top=1;,stacktop=t;/*将根指针进栈*/,while(top0),s=stacktop;/*读栈顶元素到s中*/,top-;,while(s!=NULL),第五章 树,先序遍历的非递归算法续,printf(%c,s-data);,top+;,stacktop=s-rignt;/*右指针进栈*/,s=s-left;/*修改s以继续遍历左子树*/,第五章 树,算法分析,内循环条件“s!=NULL”统一处理了三种情况:,第一次执行内循环语句时,s的值为根指针。此时“s!=NULL”意味着二叉树非空,因此接下去的操作是执行内循环体:访问根结点、根结点的右指针进栈保存、修改s为根结点的左指针。,s的值由内循环中的最后一个语句所赋值。这时s指向某结点的左儿子结点。若s!NULL成立,接下去是执行循环体遍历左子树。,当退出内循环时,由外循环中的读栈顶元素语句读出一个结点的右指针送入s,接下去执行的内循环语句实际上是遍历右子树。,返回,第五章 树,5.4,线索二叉树,在一个n结点的链式存储二叉树中,有n+1个指针域是空指针域,可以把每个空指针域用于存放分别指向某种遍历次序的前趋和后继结点的指针。,在结点的空指针域中存放的该结点在某遍历次序下的前趋结点和后继结点的指针叫做线索。,把某结点原来空的左(右)指针域用于存放指向其前趋(后继)结点的指针,也叫左(右)线索。,对一个二叉树中的所有结点的空指针域按照某种遍历次序加线索的过程叫作线索化,被线索化了的二叉树称作线索二叉树。,第五章 树,在一个线索二叉树中,必须设法将线索与指向结点左、右儿子结点的指针加以区别。,可给每个结点增加两个标志域,即左线索标志域ltag,右线索标志域rtag。,第五章 树,增加线索标志域后的结点结构为:,这种结点类型和相应结点的指针类型定义如下:,typedef struct tnode,ElemType data;,int ltag,rtag;/*ltag和rtag只能取值为0或1*/,struct tnode*left,*right;,tbtree;,第五章 树,图5.11 中序线索树,与图5.9所示二叉树对应的中序线索树如左图所示。图中的虚线箭头即为新加上的线索。,第五章 树,1.,中序线索化,对一个二叉树进行中序线索化的算法基本思想是:一边中序遍历一边建立线索。若访问结点的左儿子结点为空,则建立前趋线索;若右儿子结点为空,则建立后继线索。,为此附设一个指针pre始终指向刚刚访问过的结点,而用指针p指示当前正在访问的结点。pre的初始值为NULL。,第五章 树,中序线索化算法,void inthread(tbtree*p,*pre),if(p!=NULL),inthread(p-left,pre);/*左子树线索化*/,if(p-left=NULL),/*若当前结点的左子树为空,则建立指向其前趋结点的前趋线索*/,p-ltag=1;,p-left=pre;,else,p-ltag=0;,第五章 树,中序线索化算法续,if(pre!=NULL&pre-right=NULL),/*若前趋结点不为空,且其右指针域为空,则建立该前趋结点指向当前结点的后继线索*/,pre-rtag=1;,pre-right=p;,else,pre-rtag=0;,pre=p;/*中序向前遍历一个结点*/,inthread(p-right,pre);,第五章 树,2.,中序线索树求后继结点,在中序遍历线索树过程中,按下述两条原则即可找到后继结点:,1)如果某结点的右线索标志域为1,说明其右指针域是线索,这个线索所指的即是该结点的后继结点;,2)如果某结点的右线索标志为0,则其右指针域是指向右儿子结点的指针,由此结点的右儿子结点起按左指针域指针逐结点向左查找,一直找到左线索标志域为1的结点,即是该结点的后继结点。,第五章 树,中序线索二叉树求结点后继算法,tbtree*succ(tbtree*p),tbtree*q;,if(p-rtag=1),return(p-right);/*由后继线索得到*/,else,q=p-right;,while(q-ltag=0),q=q-left;,return(q);,第五章 树,3.,中序线索树求前趋结点,找前趋结点相应的原则如下:,1)如果某结点的左线索标志域为1,说明其左指针域是线索,这个线索所指的即是该结点的前趋结点;,2)如果某结点的左线索标志为0,则其左指针域是指向左儿子结点的指针,由此结点的左儿子结点起按右指针域指针逐结点向右查找,一直找到右线索标志域为1的结点,即是该结点的前趋结点。,第五章 树,4.,中序遍历线索树,先由根结点指针找到根结点,从根结点起沿左指针逐结点一直向左查找,找到左线索标志为1的结点(“最左”的结点)即为遍历中需首先访问的结点。,由此结点开始,反复进行寻找后继结点的过程,并陆续访问这些结点,直至结束。,第五章 树,中序遍历线索二叉树非递归算法,void thinorder(tbtree*p),if(p!=NULL)/*树非空*/,while(p-ltag=0),p=p-left;/*从根往下找到最左的结点,即中序序列的开始结点*/,do,printf(%c,p-date);/*访问结点*/,p=succ(p);,while(p!=NULL);,返回,第五章 树,5.5.1,二叉排序树,1.二叉排序树的定义,所谓排序,就是将一组杂乱无序的数据按一定的规律顺序排列起来。,对一个二叉树若规定:任一结点如果有左子树,其左子树各结点的数据必须小于该结点的数据;任一结点如果有右子树,其右子树各结点的数据必须等于或大于该结点的数据,按这样规定构成的二叉树叫做二叉排序树。,第五章 树,在一个二叉排序树中,其结点是按左子树、根和右子树的次序有序的,故对二叉排序树进行中序遍历得到的结点序列是一个有序序列。,以整数类型的数据排列为例,设要求将一批正整数按递增的次序排列,若有相同的数据,则按先后次序列出。按二叉排序树要求可将这批正整数构成一个二叉排序树,每个参加排序的数据对应二叉树的一个结点,然后,对这种树进行一次中序遍历,按访问各结点的顺序输出所有结点的数据,这些数据就是按排序所要求的次序排列的。,第五章 树,图5.12 二叉排序树,中序遍历序列:1,2,3,4,5,6,7,8,9,10,11,第五章 树,2.,二叉排序树的生成,设已知一组待排序的数据,若要构造出对应的二叉排序树,一般是采取从空树开始,陆续插入一系列结点的办法,逐步生成对应的二叉排序树。,即首先以第一个数据构成根结点,以后对应每个数据插入一个结点,在插入过程中,原有的结点位置均不再变动,只是将新数据结点作为一个端结点插入到合适的位置处,使树中任何结点与其左、右子树结点数据之间的关系都符合二叉排序树的要求。,例:待排序的数据为一组正整数:,10,15,20,5,10,30,9,7,第五章 树,图5.13 二叉排序树生成过程,第五章 树,第五章 树,第五章 树,插入一个结点的非递归算法,void insert(char x,btree*t),btree*p,*q;,int i=0;,q=(btree*)malloc(sizeof(btree);,q-data=x;,q-right=q-left=NULL;,if(t=NULL),t=q;,else,p=t;,第五章 树,插入一个结点的非递归算法续,while(i=0),if(p-datax),if(p-left!=NULL),p=p-left;,else,p-left=q;,i=1;,else,第五章 树,插入一个结点的非递归算法续,if(p-right!=NULL),p=p-right;,else,p-right=q;,i=1;,第五章 树,生成二叉排序树算法,假设一组待排序的数据均为正整数,并以1为结束输入的标志,生成二叉排序树函数如下:,void creat(btree*b),int x;,b=NULL;,do,scanf(%d,/*读入一个整数*/,insert(x,b);/*插入该结点*/,while(x!=-1);,第五章 树,5.5.2,哈夫曼树,1.哈夫曼树基本术语:,1)路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。,2)路径长度:路径上的分支数称为这两点之间的路径长度。,3)树的路径长度:树的路径长度是从树的根到每一结点的路径长度之和,一般记作pl。,在结点数目相同的二叉树中,完全二叉树或满二叉树的路径长度最短。,第五章 树,pl=0+1+1+2+2+2+2=10,pl=0+1+1+2+2+2+3=11,第五章 树,4)结点的权:在许多实际应用中,常常将树中结点赋予一个有某种意义的实数,称为该结点的权。,5)带权路径长度:从树的根结点到该结点之间的路径长度与该结点上权的乘积称为该结点的带权路径长度。,第五章 树,树的带权路径长度定义为树中所有叶子结点的带权路径长度之和,通常记为:,其中n表示叶子结点个数,w,i,和l,i,分别表示叶子结点k,i,的权值和根到k,i,之间的路径长度。,给定一组n个实数,以它们作为各个叶子结点的权,可构成不同的有n个叶子结点的二叉树,这些二叉树的带权路径长度wpl可能不同。,第五章 树,图,5.15,不同,wpl,的二叉树,给定四个数7,5,2,4作为叶子结点的权,可构成三种不同的二叉树。,wpl=36,第五章 树,图,5.15,不同,wpl,的二叉树,wpl=46,wpl=35,第五章 树,2.,哈夫曼树,哈夫曼树又称为最优二叉树,它是这样定义的:设有n个权值w,1,,w,2,,w,n,,在这些权值为各个叶子结点的权所构成的二叉树中,带权路径长度WPL最小的二叉树叫做哈夫曼树。,哈夫曼(Huffman)于1952年提出了得到这种树的算法,因此相应的算法称为哈夫曼算法。,第五章 树,3.,哈夫曼算法,将n个权值w,1,,w,2,,w,n,按递增次序排列,设其顺序为w,1,,w,2,,w,n,,取出最小的两个w,1,和w,2,,分别作为根结点的左、右儿子结点的权组成一个二叉树,并认为其根结点的权w,12,=w,1,+w,2,;,将w,12,按其数值大小插入到w,3,至w,n,之间,使数值仍保持为递增的次序;,再取出最小的两个作为根的左、右儿子的权组成二叉树,也令根的权等于此两数值之和,并同样将此根结点按权值大小插入到剩下的数据中,保持数值的递增次序。如此重复进行下去,直到构成一个二叉树为止,即得到哈夫曼树。,第五章 树,图5.16 哈夫曼算法过程,给定4个数:7,5,2,4。,第五章 树,第五章 树,第五章 树,4.,哈夫曼编码,哈夫曼编码(Haffman coding)是一种应用广泛且非常有效的数据压缩技术,该技术一般可将数据压缩20%至90%,其压缩效率取决于被压缩数据的特征。,通常我们将压缩过程称为编码,解压缩过程称为解码,利用哈夫曼树构造的用于通信的二进制编码称为哈夫曼编码。,设有一段电文“CAST_TAT_A_AS”,统计电文中字母的频度f(C)=1,f(S)=2,f=(T)=3,f=(_)=3,f=(A)=4。用频度1,2,3,3,4为权生成哈夫曼树,并在每个叶结点上注明对应的字符。,第五章 树,图5.17 Huffman编码树,C S T _ A,000 001 01 10 11,第五章 树,解码:从根结点起每输入一个数码即沿二叉树下移一层,数码为0时移向左分支,数码为1时移向右分支,待达到叶子结点时即译出一个字符,再输入的数码又从根结点开始重新做起。,将此二叉树与相应的编码方式对照可以发现,每个叶子结点至根的路径长度即等于该叶子结点所代表字符的编码位数。由于将每种字符出现的次数作为对应叶子结点的权,则计算出的带权路径长度wpl即为整个字符串的编码长度。,返回,第五章 树,例5.1,试写出如图所示二叉树的前序、中序和后序遍历序列。,第五章 树,例5.1,解:,前序:1、2、4、7、3、5、6、8、9,中序:4、7、2、1、5、3、8、6、9,后序:7、4、2、5、8、9、6、3、1,第五章 树,例5.2,设数据集合d=1,12,5,8,3,10,7,13,9,试依次取d中各数据,构造一棵二叉排序树,并给出该二叉排序树中序遍历序列。,解:本题产生的二叉排序树如图所示,中序遍历序列为:1,3,5,7,8,9,10,12,13。,第五章 树,例5.3,假设用于通信的电文由字符集a,b,c,d,e,f,g,h中的字母构成,这8个字母在电文中出现的概率分别为0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10试为这8个字母设计哈夫曼编码。,解:哈夫曼树如下面的图所示:,第五章 树,a:0010 b:10 c:00000 d:0001 e:01 f:00001 g:11 h:0011,第五章 树,例5.4,假设二叉树采用链接存储方式,编写一个中序遍历二叉树的非递归函数。,解:根据中序遍历二叉树的递归定义,转换成非递归函数时,用一个栈保存返回的结点。先扫描根结点的所有左结点并入栈,出栈一个结点,访问之,然后扫描该结点的右结点并入栈,再扫描右结点的所有左结点并入栈,如此这样,直到栈空为止。,第五章 树,例5.4算法,void inorder(btree*b),btree stackm0,*p;,int top=0;,p=b;,do,while(p!=NULL)/*扫描左结点*/,top+;,stacktop=p;,p=p-left;,第五章 树,例5.4算法续,if(top0),p=stacktop;/*p所指结点为无左子树的结点或其左子树已遍历过*/,top-;,printf(“%d”,p-data);,/*访问结点*/,p=p-right;/*扫描右子树*/,while(top!=0);,返回,第五章 树,小 结,树,二叉树,满二叉树,完全二叉树,树的存储结构,顺序存储结构,链接存储结构,二叉树的遍历,中序遍历,先序遍历,后序遍历,线索二叉树,树的应用,二叉排序树,哈夫曼树,返回,第五章 树,习题与练习,一、基础知识题,1.就如图5.21所示的树回答下面问题:,1)哪个是根结点?,2)哪些是叶子结点?,3)哪个是E的父结点?,4)哪些是E的子孙结点?,5)哪些是E的兄弟结点?哪些是C的兄弟结点?,6)结点B和结点I的层数分别是多少?,7)树的深度是多少?,8)以结点G为根的子树的深度是多少?,9)树的度是多少?,第五章 树,图5.21 树的例子,第五章 树,2.分别画出含3个结点的树与二叉树的所有不同形态。,3.高度为h的完全二叉树至少有多少个结点?最多有多少个结点?,4.采用顺序存储方法和链式存储方法分别画出图5.22所示二叉树的存储结构。,5.分别写出图5.22所示二叉树的前序、中序和后序遍历序列。,第五章 树,图5.22 二叉树例子,第五章 树,6.若二叉树中各结点值均不相同。,1)已知一个二叉树的中序和后序遍历序列分别为GDHBAECIF和GHDBEIFCA,请画出此二叉树。,2)已知一个二叉树的前序和中序分别为ABCDEFGH和BDCEAFHG,请画出此二叉树。,7.一个二叉树如图5.23所示,分别写出其前序、中序、后序的遍历序列。,8.输入一个正整数序列55,34,18,88,119,11,76,9,97,99,46,试构造一个二叉排序树。,9.有一份电文中共使用5个字符:a、b、c、d、e,它们的出现频率依次为5、2、1、6、4。试画出对应的哈夫曼树,并求出每个字符的哈夫曼编码。,第五章 树,图5.23 一个二叉树,第五章 树,二、算法设计题,1.一个二叉树以链式结构存储,分别给出求二叉树结点总数和叶子结点总数的算法。,2.一个二叉树以链式结构存储,写出在二叉树中查找值为x的结点的算法。,3.设计一个算法将一个以链式存储结构的二叉树,按顺序方式存储到一维数组中。,4.假设二叉排序树t的各元素值均不相同,设计一个算法按递增次序打印各元素值。,5.已知一个中序线索二叉树,试编写中序遍历的非递归算法。,第五章 树,此课件下载可自行编辑修改,仅供参考!感谢您的支持,我们努力做得更好!谢谢,
展开阅读全文