第4章 树和二叉树

合集下载

数据结构习题集第4章(2014更正)

数据结构习题集第4章(2014更正)

第4章树一、单项选择题:1.如下图4-1所示的4棵二叉树中,不是完全二叉树。

A. B. C. D.图4-1 4棵二叉树2.二叉树按某种顺序线索化后,任一结点均有指向其前驱和后续的线索,这种说法。

A.正确B.错误3.二叉树的先序遍历序列中,任意一个结点均处在其孩子结点的前面,这种说法。

A.正确B.错误4.由于二叉树中每个结点的度最大为2,所以二叉树是一种特殊的树,这种说法。

A.正确B.错误5.设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为。

A.2hB.2h-1C.2h+1D.h+16.如果T2是由有序树T1转换而来的二叉树,那么T1中结点的先根遍历就是T2中结点的遍历。

A.先序B.中序C.后序D.层次序7.某二叉树的先序遍历序列和后序遍历序列正好相反,则该二叉树一定是。

A.空或只有一个结点B.完全二叉树C.二叉排序树D.高度等于其结点数8. 如下图4-2所示的T2是由森林T1转化而来的二叉树,那么森林T1有 个叶子结点。

A.4B.5C.6D.7图4-2 一棵二叉树9. 按照二叉树的定义,具有3个结点的二叉树有 种。

A.3 B.4 C.5 D.610. 在一非空二叉树的中序遍历序列中,根结点的右边 。

A. 只有右子树上的所有结点B.只有右子树上的部分结点C. 只有左子树上的部分结点D.只有左子树上的所有结点11. 任何一棵二叉树的叶子结点在先序、中序和后序遍历序列中的相对次序 。

A.不发生改变B.发生改变C.不能确定D.以上都不对12. 设n ,m 为一棵二叉树上的两个结点,在中序遍历时,n 在m 前的条件是 。

A.n 在m 右方B.n 是m 祖先C.n 在m 左方D.n 是m 子孙13. 线索二叉树是一种 结构。

A.逻辑B.逻辑和存储C.物理D.线性二、填空题:1. 有一棵树如下图4-3所示,回答下面的问题:(1)这棵树的根结点是 ;(2)这棵树的叶子结点是 ;(3)结点k3的度是;(4)这棵树的度为;(5)这棵树的深度是;(6)结点k3的孩子结点是;(7)结点k3的双亲结点是。

《数据结构》课后习题答案(第2版)

《数据结构》课后习题答案(第2版)

《数据结构》课后习题答案(第2版)数据结构课后习题答案(第2版)第一章:基本概念1. 什么是数据结构?数据结构是指数据元素之间的关系,以及相应的操作。

它研究如何组织、存储和管理数据,以及如何进行高效的数据操作。

2. 数据结构的分类有哪些?数据结构可以分为线性结构和非线性结构。

线性结构包括数组、链表、栈和队列;非线性结构包括树和图。

3. 什么是算法?算法是解决特定问题的一系列有序步骤。

它描述了如何输入数据、处理数据,并产生期望的输出结果。

4. 算法的特性有哪些?算法具有确定性、有限性、输入、输出和可行性这五个特性。

5. 数据结构和算法之间的关系是什么?数据结构是算法的基础,算法操作的对象是数据结构。

第二章:线性表1. 顺序表的两种实现方式是什么?顺序表可以通过静态分配或动态分配的方式实现。

静态分配使用数组,动态分配使用指针和动态内存分配。

2. 单链表的特点是什么?单链表由节点组成,每个节点包含数据和一个指向下一个节点的指针。

它的插入和删除操作效率高,但是查找效率较低。

3. 循环链表和双向链表分别是什么?循环链表是一种特殊的单链表,在尾节点的指针指向头节点。

双向链表每个节点都有一个指向前一个节点和后一个节点的指针。

4. 链表和顺序表的区别是什么?链表的插入和删除操作效率更高,但是查找操作效率较低;顺序表的插入和删除操作效率较低,但是查找操作效率较高。

第三章:栈和队列1. 栈是什么?栈是一种特殊的线性表,只能在表的一端进行插入和删除操作。

后进先出(LIFO)是栈的特点。

2. 队列是什么?队列是一种特殊的线性表,只能在表的一端进行插入操作,在另一端进行删除操作。

先进先出(FIFO)是队列的特点。

3. 栈和队列的应用有哪些?栈和队列在计算机科学中有广泛的应用,例如浏览器的前进后退功能使用了栈,操作系统的进程调度使用了队列。

4. 栈和队列有哪些实现方式?栈和队列可以使用数组或链表来实现,还有更为复杂的如双端队列和优先队列。

数据结构(C语言版)(第2版)课后习题答案

数据结构(C语言版)(第2版)课后习题答案

数据结构(C语言版)(第2版)课后习题答案数据结构(C语言版)(第2版)课后习题答案目录第1章绪论1 第2章线性表5 第3章栈和队列13 第4章串、数组和广义表26 第5章树和二叉树33 第6章图43 第7章查找54 第8章排序65 第1章绪论1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。

答案:数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。

如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。

数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。

在有些情况下,数据元素也称为元素、结点、记录等。

数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。

数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。

例如,学生基本信息表中的学号、姓名、性别等都是数据项。

数据对象:是性质相同的数据元素的集合,是数据的一个子集。

例如:整数数据对象是集合N={0,±1,±2,。

},字母字符数据对象是集合C={‘A’,‘B’,。

,‘Z’,‘a’,‘b’,。

,‘z’},学生基本信息表也可是一个数据对象。

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。

因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。

存储结构:数据对象在计算机中的存储表示,也称为物理结构。

抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。

具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。

2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。

树和二叉树实验报告

树和二叉树实验报告

树和二叉树一、实验目的1.掌握二叉树的结构特征,以及各种存储结构的特点及适用范围。

2.掌握用指针类型描述、访问和处理二叉树的运算。

二、实验要求1.认真阅读和掌握本实验的程序。

2.上机运行本程序。

3.保存和打印出程序的运行结果,并结合程序进行分析。

4.按照二叉树的操作需要,重新改写主程序并运行,打印出文件清单和运行结果。

三、实验内容1.输入字符序列,建立二叉链表。

2.按先序、中序和后序遍历二叉树(递归算法)。

3.按某种形式输出整棵二叉树。

4.求二叉树的高度。

5.求二叉树的叶节点个数。

6.交换二叉树的左右子树。

7.借助队列实现二叉树的层次遍历。

8.在主函数中设计一个简单的菜单,分别调试上述算法。

为了实现对二叉树的有关操作,首先要在计算机中建立所需的二叉树。

建立二叉树有各种不同的方法。

一种方法是利用二叉树的性质5来建立二叉树,输入数据时要将节点的序号(按满二叉树编号)和数据同时给出:(序号,数据元素0)。

另一种方法是主教材中介绍的方法,这是一个递归方法,与先序遍历有点相似。

数据的组织是先序的顺序,但是另有特点,当某结点的某孩子为空时以字符“#”来充当,也要输入。

若当前数据不为“#”,则申请一个结点存入当前数据。

递归调用建立函数,建立当前结点的左右子树。

四、解题思路1、先序遍历:○1访问根结点,○2先序遍历左子树,○3先序遍历右子树2、中序遍历:○1中序遍历左子树,○2访问根结点,○3中序遍历右子树3、后序遍历:○1后序遍历左子树,○2后序遍历右子树,○3访问根结点4、层次遍历算法:采用一个队列q,先将二叉树根结点入队列,然后退队列,输出该结点;若它有左子树,便将左子树根结点入队列;若它有右子树,便将右子树根结点入队列,直到队列空为止。

因为队列的特点是先进后出,所以能够达到按层次遍历二叉树的目的。

五、程序清单#include<stdio.h>#include<stdlib.h>#define M 100typedef char Etype; //定义二叉树结点值的类型为字符型typedef struct BiTNode //树结点结构{Etype data;struct BiTNode *lch,*rch;}BiTNode,*BiTree;BiTree que[M];int front=0,rear=0;//函数原型声明BiTNode *creat_bt1();BiTNode *creat_bt2();void preorder(BiTNode *p);void inorder(BiTNode *p);void postorder(BiTNode *p);void enqueue(BiTree);BiTree delqueue( );void levorder(BiTree);int treedepth(BiTree);void prtbtree(BiTree,int);void exchange(BiTree);int leafcount(BiTree);void paintleaf(BiTree);BiTNode *t;int count=0;//主函数void main(){char ch;int k;do{printf("\n\n\n");printf("\n===================主菜单===================");printf("\n\n 1.建立二叉树方法1");printf("\n\n 2.建立二叉树方法2");printf("\n\n 3.先序递归遍历二叉树");printf("\n\n 4.中序递归遍历二叉树");printf("\n\n 5.后序递归遍历二叉树");printf("\n\n 6.层次遍历二叉树");printf("\n\n 7.计算二叉树的高度");printf("\n\n 8.计算二叉树中叶结点个数");printf("\n\n 9.交换二叉树的左右子树");printf("\n\n 10.打印二叉树");printf("\n\n 0.结束程序运行");printf("\n============================================");printf("\n 请输入您的选择(0,1,2,3,4,5,6,7,8,9,10)");scanf("%d",&k);switch(k){case 1:t=creat_bt1( );break; //调用性质5建立二叉树算法case 2:printf("\n请输入二叉树各结点值:");fflush(stdin);t=creat_bt2();break; //调用递归建立二叉树算法case 3:if(t){printf("先序遍历二叉树:");preorder(t);printf("\n");}else printf("二叉树为空!\n");break;case 4:if(t){printf("中序遍历二叉树:");inorder(t);printf("\n");}else printf("二叉树为空!\n");break;case 5:if(t){printf("后序遍历二叉树:");postorder(t);printf("\n");}else printf("二叉树为空!\n");break;case 6:if(t){printf("层次遍历二叉树:");levorder(t);printf("\n");}else printf("二叉树为空!\n");break;case 7:if(t){printf("二叉树的高度为:%d",treedepth(t));printf("\n");}else printf("二叉树为空!\n");break;case 8:if(t){printf("二叉树的叶子结点数为:%d\n",leafcount(t));printf("二叉树的叶结点为:");paintleaf(t);printf("\n");}else printf("二叉树为空!\n");break;case 9:if(t){printf("交换二叉树的左右子树:\n");exchange(t);prtbtree(t,0);printf("\n");}else printf("二叉树为空!\n");break;case 10:if(t){printf("逆时针旋转90度输出的二叉树:\n");prtbtree(t,0);printf("\n");}else printf("二叉树为空!\n");break;case 0:exit(0);} //switch}while(k>=1&&k<=10);printf("\n再见!按回车键,返回…\n");ch=getchar();} //main//利用二叉树性质5,借助一维数组V建立二叉树BiTNode *creat_bt1(){ BiTNode *t,*p,*v[20];int i,j;Etype e;/*输入结点的序号i、结点的数据e*/printf("\n请输入二叉树各结点的编号和对应的值(如1,a):");scanf("%d,%c",&i,&e);while(i!=0&&e!='#') //当i为0,e为'#'时,结束循环{p=(BiTNode*)malloc(sizeof(BiTNode));p->data=e;p->lch=NULL;p->rch=NULL;v[i]=p;if(i==1)t=p; //序号为1的结点是根else{j=i/2;if(i%2==0)v[j]->lch=p; //序号为偶数,作为左孩子else v[j]->rch=p; //序号为奇数,作为右孩子}printf("\n请继续输入二叉树各结点的编号和对应的值:");scanf("%d,%c",&i,&e);}return(t);}//creat_bt1;//模仿先序递归遍历方法,建立二叉树BiTNode *creat_bt2(){BiTNode *t;Etype e;scanf("%c",&e);if(e=='#')t=NULL; //对于'#'值,不分配新结点else{t=(BiTNode *)malloc(sizeof(BiTNode));t->data=e;t->lch=creat_bt2(); //左孩子获得新指针值t->rch=creat_bt2(); //右孩子获得新指针值}return(t);} //creat_bt2//先序递归遍历二叉树void preorder(BiTNode *p){if(p){printf("%3c",p->data);preorder(p->lch);preorder(p->rch);}} //preorder//中序递归遍历二叉树void inorder(BiTNode *p){if(p){inorder(p->lch);printf("%3c",p->data);inorder(p->rch);}} //inorder//后序递归遍历二叉树void postorder(BiTNode *p){ if(p){ postorder(p->lch);postorder(p->rch);printf("%3c",p->data);}} //postordervoid enqueue(BiTree T){if(front!=(rear+1)%M){rear=(rear+1)%M;que[rear]=T;}}BiTree delqueue( ){if(front==rear)return NULL;front=(front+1)%M;return(que[front]);}void levorder(BiTree T) //层次遍历二叉树{BiTree p;if(T){enqueue(T);while(front!=rear){p=delqueue( );printf("%3d",p->data);if(p->lch!=NULL)enqueue(p->lch);if(p->rch!=NULL)enqueue(p->rch);}}}int treedepth(BiTree bt) //计算二叉树的高度{int hl,hr,max;if(bt!=NULL){ hl=treedepth(bt->lch);hr=treedepth(bt->rch);max=(hl>hr)?hl:hr;return (max+1);}else return (0);}void prtbtree(BiTree bt,int level) //逆时针旋转90度输出二叉树树形{int j;if(bt){prtbtree(bt->rch,level+1);for(j=0;j<=6*level;j++)printf(" ");printf("%c\n",bt->data);prtbtree(bt->lch,level+1);}}void exchange(BiTree bt) //交换二叉树左右子树{BiTree p;if(bt){p=bt->lch;bt->lch=bt->rch;bt->rch=p;exchange(bt->lch);exchange(bt->rch);}}int leafcount(BiTree bt) //计算叶结点数{if(bt!=NULL){leafcount(bt->lch);leafcount(bt->rch);if((bt->lch==NULL)&&(bt->rch==NULL))count++;}return(count);}void paintleaf(BiTree bt) //输出叶结点{if(bt!=NULL){if(bt->lch==NULL&&bt->rch==NULL)printf("%3c",bt->data);paintleaf(bt->lch);paintleaf(bt->rch);}}图11.2所示二叉树的输入数据顺序应该是:abd#g###ce#h##f##。

2016年考研核心题型【数据结构部分】【第4章 树与二叉树】

2016年考研核心题型【数据结构部分】【第4章 树与二叉树】

其余的 b 和 c 结点都各有一个前驱结点和后继结点。
那么,将 d 右指针域(初始为空)调整并指向其后继结点 b。将 b 结点的左指针域调整
指向其前驱结点 d,因为 b 的右指针域不为空,所以线索化过程中不需要调整。c 的左右指
针域都为空,令其左指针域指向其前驱结点 b,右指针域指向其后继结点 a。
有在已知前序遍历序列或者后序遍历序列的情况下,又知道中序遍历序列,才能唯一确定
一棵二叉树。
遍历一棵二叉树,要使得前序遍历序列和后序遍历序列刚好相反,那么必须保证每一
个结点都只有一个孩子结点。故而,二叉树的高度为 4。那么,在前序遍历序列为 1、2、3、
4,后序遍历序列为 4、3、2、1 的情况下,该二叉树第 1、2、3、4 层的结点依次为 1、2、
【解析】对于某一种遍历顺序对应的线索化,只需写出对应的遍历序列,然后修改空
指针域分别指向该遍历序列的前驱和后继即可。例如,本题中的二叉树的后序遍历可得到
序列 d、b、c、a。那么,d 是第一个元素,没有前驱,所以其左指针域原来为空,线索化时
亦为空;a 是最后一个元素,但是其左右孩子都不为空,所以不需要考虑该结点的线索化;
24
13
53
37
90
48
图 4.4 插入新的结点 48 之后,我们沿着叶子结点 48 往根节点的路径上,查找第一个不平衡 的结点。显然,24 是第一个不平衡的结点,其左子树的高度为 1,右子树的高度为 3。图中 的粗线部分,即需要旋转的部分。 那么,造成了什么类型的不平衡呢?我们这样判断:53 是 24 右孩子(R),37 是 24 的左孩子(L),所以是 RL 型不平衡。于是,先把结点 24 的右孩子 53 的左孩子 37 向右上 方旋转到原来 53 的位置,再将 37 向左上旋转到 24 的位置,24 被旋转下来。成了如图 4.5 所示的样子。

大学计算机基础电子教材-第4章

大学计算机基础电子教材-第4章

第4章 数据结构与算法本章介绍数据结构与算法,内容包括算法和数据结构的基本概念、栈及线性链表、树与二叉树、排序技术、查找技术。

●了解数据结构与算法的基本概念。

●了解栈与线性链表的操作。

●了解树与二叉树。

●了解数据结构中的排序技术和查找技术。

4.1 算法的概念4.1.1 算法的基本概念程序是算法用某种程序设计语言的具体实现。

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。

也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。

如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。

不同的算法可能用不同的时间、空间或效率来完成同样的任务。

一个算法的优劣可以用空间复杂度和时间复杂度来衡量。

算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。

一个状态到另一个状态的转移不一定是确定的。

随机化算法在内的一些算法包含了一些随机输入。

算法具有的一些重要特性:(1)有限性。

算法在执行有限步之后必须终止。

(2)确定性。

算法的每一个步骤都是有精确的定义的。

执行的每一步都是清晰的、无二义的。

大学计算机基础84(3)输入。

一个算法具有任意个输入,它是由外部提供的,作为算法执行前的初始状态。

(4)输出。

算法一定有输出结果。

(5)可行性。

算法中的运算都必须是可以实现的。

4.1.2 算法的复杂度1.时间复杂度算法的时间复杂度采用算法执行过程中其基本操作的执行次数,即计算量来度量。

算法中基本操作的执行次数一般是与问题的规模有关的,对于节点个数为n的数据处理问题,用T(n)表示算法基本操作的执行次数。

当比较不同算法的时间性能时,主要标准是看不同算法时间复杂度所处的数量级如何。

例如:以上算法中,循环体中的代码执行了n次,因此算法的时间复杂度为O(n)。

全国计算机等级考试四级复习纲要:树和二叉树

全国计算机等级考试四级复习纲要:树和二叉树(2)二叉树的顺序存储结构二叉树的顺序存储结构由一个一维数组构成,二叉树上的结点按某种次序分别存入该数组的各个单元。

显然,这里的关键在于结点的存储次序,这种次序应能反映结点之间的逻辑关系(父子关系),否则二叉树的基本运算就难以实现。

由二叉树的性质5可知,若对任一完全二叉树上的所有结点按层编号,则结点编号之间的数值关系可以准确地反映结点之间的逻辑关系。

因此,对于任何完全二叉树来说,可以采用“以编号为地址”的策略将结点存入作为顺序存储结构的一维数组。

具体地说就是:将编号为i的结点存入一维数组的第i个单元。

在这一存储结构中,由于一结点的存储位置(即下标)也就是它的编号,故结点间的逻辑关系可通过它们下标间的数值关系确定。

(3)双亲表示法树上每个结点的孩子可以有任意多个,但双亲只有一个。

因此,通过指向双亲的指针而将树中所有结点组织在一起形成一种存储结构是十分简法的。

树的这种存储表示方法称为双亲表示法。

在双亲表示法下,每个存储结点由两个域组成:数据域———用于存储树上结点中的数据元素;“指针”域———用于指示本结点之双亲所在的存储结点。

值得注意的是,“指针”域的类型定义可以有两种选择。

第一种是将其定义为高级语言(如C语句)中的指针类型。

通过将存储结点中的指针域定义为高级语言中的指针类型,就得到各种链式存储结构,如单链表、二叉链表、孩子链表等等。

第二种选择是将“指针”域定义为整型、子界型等型。

严格地说,无论选择上述哪种定义,得到的都是链式存储结构,因为在这两种定义之下,各存储结点之间的联结是通过“指针”完成的,而且这些指针反映了结点之间的逻辑关系。

为了区别这两种链式结构,通常将指针域定义为高级语言中的指针类型的各种链式存储结构(如单链表、二叉链表等等)称为“动态链表”,相应的指针称为“动态指针”;将指针域定义为整型、子界型等类型的各种键式存储结构称为“静态链表”,相应的“指针”称为:“静态指针”。

第四章 树的习题


(4)若一棵完全二叉树中,某节点无左孩子,则该 结点一定是( )。 A.度为1的结点 B.度为2的结点 C.分支节点 D.叶子结点 (5)高度为k的完全二叉树至多有( )个结点, 至少有( )个结点。 A.2K-1-1 B. 2K-1 C.2K-1 D.2K (6)先序序列为ABC的二叉树有( )棵。 A. 3 B.4 C.5 D.6 (7)在有200个结点的完全二叉树中,根的编号为1, 则编号为60的结点左孩子编号是( ),右孩子的编 号是( )。 A.30 B.60 C.120 D.121
(8)遍历一棵具有n个结点的完全二叉树,在先序, 中序和后序序列中,叶子结点的相对次序( )。 A.都不同 B.完全相同 C.先序和中序相同 D.中序与后序相同 (9)在由4棵树组成的森林中,1,2,3,4棵树,树 中结点的个数分别为30,10,20,5,当把森林转化 成为二叉树后,对应的二叉树中根结点的左子树中结 点的个数是( ),右子树中结点的个数是( )。 A.20 B.29 C.30 D.35 (10)有n(n>1)个结点的二叉树的先序序列与后序 序列相反,则二叉树中除了叶子外,每个结( )。 A.仅有左孩子 B.仅有右孩子 C.仅有一个孩子 D.都有两个孩子
(4)一棵深度为h的满k叉树有如下性质: 第h层上 的结点都是叶子结点,其余各层上每个结点都有 k棵 非空子树。 如果按层次顺序(同层自左至右)从1开始 对全部结点编号,问: ① 各层的结点数是多少? ② 编号为i的结点的双亲结点(若存在)的编号是 多少? ③ 编号为i的结点的第j个孩子结点(若存在)的编 号是多少? ④ 编号为i的结点的有右兄弟的条件是什么? 其 右兄弟的编号是多少?
(6)一个含有68个结点的完全二叉树,它的高度是 ( )。 (),其中叶子结点个数是 ( );则总结点数至多是( ),其中叶子结 点个数是( )。 (8)一棵树转化成二叉树后,这棵二叉树的根节点 一定没有( )孩子,若树中有m个分支结点,则对 应二叉树中( )个结点没有右孩子。 (9)若用二叉链表表示具有n个结点的二叉树,则有 ( )个空链域。 (10)具有m个叶子结点的赫夫曼树,共有( )个 结点。

自考软件基础(数据结构--树与二叉树)

A
B
C
D
E
F
G
H
I
J
第 5 /209页
第二节 二叉树
一、定义
南昌大学
二叉树是一种重要的树形结构,它的特点是:二叉树可以为空(节点个
数为0),任何一个节点的度都小于或等于2,并且,子树有左、右之分,
其次序不能任意颠倒。 二叉树有5种基本形态,如图10-2所示。
第 6 /209页
第二节 二叉树
南昌大学
struct node
{ datatype data; struct node *Lchild,*rchild:
};
第 15 /209页
第二节 二叉树
南昌大学
例10-5 写出图10-8a所示二叉树的链式存储结构。其链式结构如图10-8b 所示。可以看出:具有n个节点的二叉树链式存储共有2n个链,其中只 有n-1个用来存放该节点的左、右孩子,其余的n +1个指针域为空。
解:第一步:由后序遍历结果确定整个二叉树根为A,由中序结果确定
A的左、右子树。 后序遍历结果: 中序遍历结果:
第 24 /209页
第三节 二叉树的遍历
第二步:确定A的左子树。 1)后序遍历结果:
南昌大学
中序遍历结果:
2)确定B的右子树: ①后序遍历结果:
第 25 /209页
第三节 二叉树的遍历
②中序遍历结果:
南昌大学
第 9 /209页
第二节 二叉树
下面介绍两种特殊的二叉树。
南昌大学
(1) 满二叉树指深度为k,且有2k-1个节点的二叉树。或者说除叶子节点外,
其它节点的度都为2的二叉树。
(2) 完全二叉树一个满二叉树的最下层从右向左连续缺少n (n>=0)个节点 的二叉树。 图10-3为满二叉树和完全二叉树示例。

计算机软件技术基础第4章 树形结构

ቤተ መጻሕፍቲ ባይዱ
假定有一段报文由a、b、c、d四个字符构成,它们 的使用频率比为6﹕4﹕2﹕1,则用a、b、c、d作为 叶子结点构造哈夫曼树的过程如图所示。
若二叉树中的左分支代表0,右分支代表1,则a、b、 c、d的哈夫曼编码分别为0、10、110、111。
【例】假定编码系统中有五个字符X、S、D、E、A, 它们的使用频率比为2﹕9﹕5﹕7﹕8,以这些频 率值作叶子的权构造哈夫曼树,并输出哈夫曼编 码。
为了不使二进制编码具有二义性,每个字符编码 都不能与其他字符编码的前面若干位重合。
可以利用二叉树分析字符编码问题。假设二叉树中的 左分支代表0,右分支代表1,则不论字符是采用何种 0、1组合形式构成的编码,它必然对应某个二叉树中 一个叶子结点。
0 C 0 B 1 A 1 D 0 C 0 0 A 1 B 1 1 D
A
A C B G D C
B
D E F
E
完全二叉树
满二叉树
二叉树有下列重要性质:
(1)在二叉树的第k层上至多有2k-1个结点(k≥1) 证明:当k=1时,命题显然成立。假定k=n-1时命 题成立,则第n层(k=n)的结点数最多是第n-1 层的2倍,所以第n层最多有2*2n-2=2n-1个结点。命 题成立。 (2)深度为h的二叉树上至多含2h-1个结点(h≥1) 证明:根据性质1容易知道深度为h的二叉树最多 有20+21+…+2h-1个结点,即最多有2h-1个结点。
A B E C F
D G
树的一般形式
与树相关的术语
• 结点:树的数据元素
• • • • • 结点的度:结点拥有的非空子树的个数 树的度:树中所有结点的度的最大值 叶子结点:度为0的结点。 分支结点:至少有一个非空子树的结点。 孩子结点和父结点:某结点所有子树的根 结点都称为该结点的孩子结点,同时该结 点也称为其孩子结点的父结点。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第4章树和二叉树[能力要求](1)计算机基础知识:掌握树和二叉树的概念以及树和二叉树的基本操作。

(2)分析问题:针对具体的问题,要能够运用树和二叉树去进行分析,逐步找到解决问题的方法。

(3)具有概念化和抽象化能力:针对具体的应用和实际的问题,能够运用树和二叉树对问题进行抽象,提取它的逻辑结构和存储结构。

(4)发现问题和表述问题:在具体的工程中,能够发现工程中涉及到树和二叉树的问题,并能够明确表述。

(5)建模:在具体的工程中,能够使用树和二叉树进行建模,设计合理的数据结构和相应的算法。

(6)解决方法和建议:在具体工程应用中,发现了关于树和二叉树的问题,要能够解决问题,并提出合理的建议。

(7)定义功能,概念和结构:使用树和二叉树这种逻辑结构处理一些具体问题,实现系统的功能。

(8)设计过程的分段与方法:采取不同的阶段去设计(概念设计、详细设计)一个具体的树和二叉树的应用项目。

(9)软件实现过程:了解系统中各个模块中的关于树和二叉树的设计;讨论算法(数据结构、控制流程、数据流程);使用编程语言实施底层设计(编程)。

4.1知识点:树和二叉树的基本概念一、选择题1②在一棵具有n个结点的完全二叉树中,分支结点的最大编号为()。

假定树根结点的编号为0。

A.(n-1)/2 B.n/2C.n/2+1 D.n/2-12②在一棵完全二叉树中,若编号为i的结点存在左孩子,则左子女结点的编号为()。

假定根结点的编号为0。

A.2i B.2i-1C.2i+1 D.2i+23②在一棵具有35个结点的完全二叉树中,该树的高度为()。

假定空树的高度为-1。

A.5 B.6C.7 D.84②树中所有结点的度等于所有结点数加()。

A.0 B.1C.-1 D.25②在一棵具有n个结点的二叉树的第i层上(假定根结点为第0层,i大于等于0而小于等于树的高度),最多具有( )个结点。

A .2iB .12i +C .12i -D .2n6② 在一棵完全二叉树中,假定根结点的编号为0,则对于编号为I (I >0)的结点,其双亲结点的编号为( )。

A .(I+1)/2B .(I -1)/2C .I/2D .I/2-17③ 在一棵具有n 个结点的二叉树中,所有结点的空子树个数等于( )。

A .nB .n -1C .n+1D .2*n8③ 在一棵高度为h (假定根结点的层号为0)的完全二叉树中,所含结点个数不小于( )。

A .12h - B .12h +C .21h-D .2h9② 如下的4棵二叉树中,( )不是完全二叉树。

ABCD图4.1 10题图10② 深度为5的二叉树至多有( )个节点。

A .16 B .32 C .31D .1011③ 对一棵满二叉树而言,m 个树叶,n 个节点,深度为h ,则下列哪个等式正确( )。

A .n=h+mB .h+m=2nC .m=n -1D .n= 2h-112② 有一棵非空的二叉树,共有n 个节点,其中分支度为2的结点有w 个,则分支度为1的结点个数为( )。

A .n -2wB .n -2w -1C .n -w+1D .n -2w+113② 具有n (n>0)个结点的完全二叉树的深度为( )。

A .⎡2log n ⎤B .⎣ 2log n ⎦C .⎣ 2log n ⎦+1D .⎡(2log n )+1⎤14② 设树T 的度为4,其中度为1,2,3 和4 的结点个数分别为4,2,1,1 则T 中的叶子数为( )【南京理工大学 2000】A.5 B.6 C.7 D.815②在下述结论中,正确的是()。

【南京理工大学 1999】(1)只有一个结点的二叉树的度为0; (2)二叉树的度为2;(3)二叉树的左右子树可任意交换;(4)深度为K 的完全二叉树的结点个数小于或等于深度相同的满二叉树。

A.(1)(2)(3) B.(2)(3)(4) C.(2)(4) D.(1)(4)16②若一棵二叉树具有10 个度为2 的结点,5 个度为1 的结点,则度为0 的结点个数是()【北京工商大学 2001】A.9 B.11 C.15 D.不确定17②一棵完全二叉树上有1001 个结点,其中叶子结点的个数是()。

【西安交通大学 1996】A. 250 B. 500 C.254 D.505 E.以上答案都不对二、填空题1②由3个结点所构成的二叉树有______种形态;16个结点可构造出________种不同形态的二叉树。

2②将含有82个结点的完全二叉树从根结点开始顺序编号,根结点为第0号,其他结点自上向下,同一层自左向右连续编号。

则第40号结点的双亲结点的编号为________。

3①在一棵树中,______结点没有前驱结点。

4②假定一棵二叉树的结点个数为18,则它的最小高度为______。

假定根结点的高度为0。

5②假定一棵三叉树(即度为3的树)的结点个数为50,则它的最小高度为______。

假定根结点的高度为0。

6②一棵高度为5的完全二叉树中,最多包含有______个结点。

假定根结点的高度为0。

7②在一棵三叉树中,度为3的结点数有2个,度为2的结点数有1个,度为1的结点数为2个,那么度为0的结点数有______个。

8②在一棵高度为3的四叉树中,最多含有______结点。

9②一棵深度为6的满二叉树有______个分支结点和______个叶子。

10②一棵具有257个结点的完全二叉树,它的深度为______。

11②设一棵完全二叉树具有1000个结点,则此完全二叉树有______个叶子结点,有______个度为2的结点,有______个结点只有非空左子树,有______个结点只有非空右子树。

12②对于一棵具有n个结点的树,该树中所有结点的度数之和为_________。

13②一棵具有n个结点的二叉树,若它有n0个叶子结点,则该二叉树上度为1的结点n1=______。

14②如果结点A有3兄弟,而且B是A的双亲,则B的度是______。

15②对于一棵完全二叉树,设一个结点的编号为i,若它的左孩子结点存在,则其编号为________;若右孩子结点存在,则其编号为________;而双亲结点的编号为_________。

16②深度为k 的完全二叉树至少有个结点,至多有个结点。

【厦门大学 2001】【南京理工大学 1999】17②已知一棵度为3 的树有2 个度为1 的结点,3 个度为2 的结点,4 个度为3 的结点,则该树有_________个叶子结点。

【厦门大学 2000】18② 一棵有n 个结点的满二叉树有_________个度为1 的结点、有_________个分支 (非终端)结点和_________个叶子,该满二叉树的深度为_________。

【华中理工大学 2000】三、判断题( )1① 二叉树中每个结点的两棵子树是有序的。

( )2① 二叉树中每个结点有两棵非空子树或有两棵空子树。

( )3② 对于一棵非空二叉树,它的根结点作为第一层,则它的第i 层上最多能有2i -1个结点。

( )4② 具有12个结点的完全二叉树有5个度为2的结点。

( )5① 完全二叉树的某结点若无左孩子,则它必是叶结点。

( )6② 二叉树中不存在度大于2的结点,当某个结点只有一棵子树时无所谓左、右子树之分。

( )7② 当k ≥1时,高度为k 的二叉树至多有21k个结点。

( )8② 一棵含有n 个结点的完全二叉树,它的高度是2log n +1。

( )9① 二叉树就是结点度为2的树。

【长沙铁道学院1997】【中科院软件所1997】 ( )10② 完全二叉树一定存在度为1 的结点。

【青岛大学 2002】 ( )11① 树形结构中元素之间存在一个对多个的关系。

【燕山大学 1998】 ( )12① 树与二叉树是两种不同的树型结构。

【东南大学 2001】 四、简答题1③ 已知一棵度为m 的树中有1N 个度为1的结点, 2N 个度为2的结点,…, m N 个度为m 的结点。

试问该树中有多少个叶子结点?2③ 若一棵度为4的树中度为1、2、3、4的节点个数分别为4、3、2、2,则该树叶子结点的个数是多少?总结点个数是多少?3④ 已知二叉树有50个叶子结点,则该二叉树的总结点数至少应有多少个? 4③ 已知一棵完全二叉树共有892个结点,试求:(1)树的高度。

(2)叶子结点数。

(3)分支结点数。

(4)最后一个非终端结点的序号。

5③ 树和二叉树之间有什么样的区别与联系?【西北工业大学 1998】【厦门大学 2000】【燕山大学2001】4.2知识点:二叉树和树的存储结构一、选择题1①在一棵树的左子女-右兄弟表示法中,一个结点的右孩子是该结点的()结点。

A.兄弟B.子女 C.祖先D.子孙2②在一棵树的静态双亲表示中,每个存储结点包含()个域。

A.1 B.2 C.3 D.43②在一棵二叉树的二叉链表中,空指针域数等于非空指针域数加()。

A.2 B.1 C.0 D.-14②二叉树是非线性数据结构,所以()。

A.它不能用顺序存储结构存储B.它不能用链式存储结构存储C.顺序存储结构和链式存储结构都能存储D.顺序存储结构和链式存储结构都不能使用5②利用二叉链表存储树,则根结点的右指针是()。

【青岛大学 2001】A.指向最左孩子 B.指向最右孩子 C.空 D.非空6②在下列存储形式中,哪一个不是树的存储形式?()【北方交通大学 2001】A.双亲表示法 B.孩子链表表示法 C.孩子兄弟表示法 D.顺序存储表示法7②一棵有n 个结点的二叉树,按层次从上到下,同一层从左到右顺序存储在一维数组A[1..n]中,则二叉树中第i 个结点(i 从1 开始用上述方法编号)的右孩子在数组A 中的位置是()【南京理工大学 2000】A. A[2i](2i<=n) B. A[2i+1](2i+1<=n)C. A[i-2] D.条件不充分,无法确定二、填空题1①二叉树通常有_________存储结构和____________存储结构。

三、判断题()1②若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n-1个非空指针域。

()2①树适合于表示层次关系。

() 3②完全二叉树的存储结构通常采用顺序存储结构。

【南京航空航天大学 1996】四、简答题1②描述二叉树的顺序存储。

2②描述二叉树的链式存储。

3②如在内存中存放一个完全二叉树,在树上只进行下面两个操作:(1)寻找某个结点双亲(2)寻找某个结点的儿子;请问应该用何种结构来存储该二叉树?【东北大学 2001】4.3知识点:树、森林向二叉树的转换一、选择题1②把一棵树转换为二叉树后,这棵二叉树的形态是()。

A.唯一的B.有多种C.有多种,但根结点都没有左孩子D.有多种,但根结点都没有右孩子2②如下图所示的二叉树T2是由森林T1转换而来的二叉树,那么森林T1有()个叶子结点。

相关文档
最新文档