《数据结构A》第06章
数据结构第六章树和二叉树习题及答案

习题六树和二叉树一、单项选择题1.以下说法错误的是()A. 树形结构的特点是一个结点可以有多个直接前趋B. 线性结构中的一个结点至多只有一个直接后继C. 树形结构可以表达(组织)更复杂的数据D. 树(及一切树形结构)是一种”分支层次”结构E. 任何只含一个结点的集合是一棵树2. 下列说法中正确的是()A. 任何一棵二叉树中至少有一个结点的度为2B. 任何一棵二叉树中每个结点的度都为2C. 任何一棵二叉树中的度肯定等于2D. 任何一棵二叉树中的度可以小于23. 讨论树、森林和二叉树的关系,目的是为了()A. 借助二叉树上的运算方法去实现对树的一些运算B. 将树、森林按二叉树的存储方式进行存储C. 将树、森林转换成二叉树D. 体现一种技巧,没有什么实际意义4.树最适合用来表示()A. 有序数据元素 B .无序数据元素C.元素之间具有分支层次关系的数据 D .元素之间无联系的数据5.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是()A.9 B .11 C .15 D .不确定6. 设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1, M2和M3与森林F对应的二叉树根结点的右子树上的结点个数是()。
A.M1 B .M1+M2 C .M3 D .M2+M37.一棵完全二叉树上有1001个结点,其中叶子结点的个数是()A.250 B .500 C .254 D .505 E .以上答案都不对8. 设给定权值总数有n 个,其哈夫曼树的结点总数为()A. 不确定 B . 2n C . 2n+1 D . 2n-19.二叉树的第I 层上最多含有结点数为()I I-1 I-1 IA.2IB .2I-1-1 C .2I-1D .2I-110.一棵二叉树高度为h, 所有结点的度或为0,或为2,则这棵二叉树最少有()结点A.2h B .2h-1 C .2h+1 D .h+111. 利用二叉链表存储树,则根结点的右指针是()。
数据结构数据结构6

// 访问结点
4 Preorder(T->lchild, visit); // 遍历左子树
5 Preorder(T->rchild, visit);// 遍历右子树
6} 7}
T
A
B
D
可以这样理解:无论先序、中序、后序 遍历二叉树,遍历时的搜索路线是相同的: 从根节点出发,逆时针延二叔叉树外缘移动 对每个节点均途径三次。
(2) 若 2i>n,则该结点无左孩子, 否则,编号为 2i 的结点为其左孩子结点; (3) 若 2i+1>n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子结点。
6.3
二叉树的存储结构
一、 二叉树的顺序 存储表示
二、二叉树的链式 存储表示
一、 二叉树的顺序存储表示
#define MAX_TREE_SIZE 100 // 二叉树的最大结点数
}
void Inorder_I(BiTree T, void (*visit) (TelemType& e)){
Stack *S;
t = GoFarLeft(T, S); // 找到最左下的结点
while(t){ visit(t->data); if (t->rchild) t = GoFarLeft(t->rchild, S);
二叉树 的重要特性
性 质
1
:
在二叉树的第 i 层上至多有
2i-1 个结点。 (i≥1)
用归纳法证明:
归纳基: i = 1 层时,只有一个根结点: 2i-1 = 20 = 1;
归纳假设:假设对所有的 j,1≤ j i,命题成立; 归纳证明:二叉树上每个结点至多有两棵子树,
数据结构第六章习题答案

删除40 删除70 删除60struct node { int data;struct node *lchild, *rchild;};typedef struct node NODE;NODE *create_tree(a,i,j)int a[ ],i,j;{NODE *p;int k;if(i>j) return(NULL);k=(i+j)/2;p=(NODE *)malloc(sizeof(NODE));p->data=a[k];p->lchild=create_tree(a,i,k-1);p->rchild=create_tree(a,k+1,j);return(p);}6. 3int check(root)NODE *root;{int x;if(root==NULL)return(0);if(root->data<root->rchild->data&&root->data>root->lchild->data) {x=check(root->rchild);if(!x) return(check(root->lchild));}return(1);}6. 4int height(root)NODE *root;{int h,k;if(root==NULL)return(-1);else if(root->lchild==NULL&&root->rchild==NULL)return(0);elseh=height(root->lchild);k=height(root->rchild);if(h>k)return(h+1);elsereturn(k+1);}}6. 5#include “math.h”int check_beltree(root)NODE *root;{int a;if(root==NULL)return(1);if(check_beltree(root->lchild)==0||check_beltree(root->rchild)==0) return(0);a=abs(height(root->rchild)-height(root->lchild)); //上题函数if(a<=1)return(1);}6.76.8结点k1 k2 k3 k4 k5结点值10 30 50 70 90相对使用频率(pi)p1 p2 p3 p4 p55 6 3 7 4外部结点使用频率(qi) q0 q1 q2 q3 q4 q54 2 1 2 3 4 本题的分析与计算,请参考“习题6.8”(Excel表),最后结果为:。
《数据结构A》第06章

6.1.2 动态集ADT
ADT DynamicSet { 数据:
同类元素的有限汇集,其最大允许长度为 MaxSetSize。元素由关键字标识,集合的元 素各不相同。 运算: Create();创建一个空集合。 Destroy():撤消一个集合。 IsEmpty():若集合为空,则返回true,否则
else return m; //搜索成功
}
return -1;
//搜索失败
}
函数Search调用递归函数BSearch实现有序 表的二分搜索
template <class T> ResultCode ListSet<T>::Search( T& x)const {
int i=BSearch(x,0,n-1); if (i==-1) return NotPresent; x=l[i];return Success; }
数据结构
Data Structures in C++
第6章 集合和搜索
6.1 基本概念 6.2 顺序搜索 6.3 二分搜索
6.1 基本概念
6.1.1 集合和搜索的概念
在数学上,集合 是不同对象的无序汇集 ,集合的 对象称为元素或成员,每个元素仅出现一次。 多重集 是元素的无序汇集,其中,每个元素可出现 一次或多次。例如, 多重集 {1, 1, 2, 3} 与 {1, 2, 3, 1}相同,但与 {1, 2, 3}不同。 通常用大括号表示无序集。 一个有序集是元素的汇集,其中,每个元素可以出 现一次或多次,并且它们的出现次序是重要的(如 同向量一样)。通常用圆括号表示有序集,例如, (2,1,3)。
数据结构答案第6章

数据结构答案第6章第6章数据结构答案1. 栈的应用栈是一种常见的数据结构,其特点是先进后出。
下面是一些关于栈的应用场景。
1.1 函数调用栈在程序中,每当一个函数被调用时,相关的变量和状态信息会被存储在一个称为函数调用栈的栈中。
1.2 表达式求值栈也常用于表达式求值,特别是中缀表达式转后缀表达式的过程中。
通过使用栈,我们可以很方便地进行算术运算。
1.3 逆序输出如果我们需要逆序输出一段文本、字符串或者其他数据,可以使用栈来实现。
将数据依次压入栈中,然后再逐个弹出即可。
2. 队列的实现与应用队列是另一种常见的数据结构,其特点是先进先出。
下面是一些关于队列的实现和应用。
2.1 数组实现队列队列可以使用数组来实现。
我们可以使用两个指针分别指向队列的前端和后端,通过移动指针来实现入队和出队的操作。
2.2 链表实现队列队列还可以使用链表来实现。
我们可以使用一个指针指向队列的头部,并在尾部添加新元素。
通过移动指针来实现出队操作。
2.3 广度优先搜索(BFS)队列常用于广度优先搜索算法。
在BFS中,我们需要按照层级来访问节点。
使用队列可以帮助我们按照顺序存储和访问节点。
3. 树的遍历和应用树是一种非常重要的数据结构,在计算机科学中应用广泛。
下面是一些关于树的遍历和应用的介绍。
3.1 深度优先搜索(DFS)深度优先搜索是树的一种遍历方式。
通过递归或者使用栈的方式,可以按照深度优先的顺序遍历树的所有节点。
3.2 广度优先搜索(BFS)广度优先搜索也可以用于树的遍历。
通过使用队列来保存要访问的节点,可以按照层级的顺序遍历树。
3.3 二叉搜索树二叉搜索树是一种特殊的二叉树,它的每个节点的值都大于左子树中的值,小于右子树中的值。
这种结构可以用于高效地进行数据查找。
4. 图的表示与遍历图是由节点和边组成的一种数据结构。
下面是一些关于图的表示和遍历的说明。
4.1 邻接矩阵表示法邻接矩阵是一种常见的图的表示方法。
使用一个二维数组来表示节点之间的连接关系。
数据结构课件第六章

6
广义表表示法
( A ( B ( E ( K, L ), F ), C ( G ), D ( H ( M ), I, J ) )
根作为由子树森林组成的表的名字写在表的左边
data link 1 link 2 ... 麻烦问题:应当开设多少个链域? link n
7
左孩子-右兄弟表示法
( A ( B ( E ( K, L ), F ), C ( G ), D ( H ( M ), I, J ) ) ) 数据 右兄弟 左孩子
数据结构课程的内容
1
第6章 树和二叉树( Tree & Binary Tree )
特点:非线性结构,一个直接前驱,但可能有多个 直接后继(1:n)
6.1 6.2 6.3 6.4 6.5
树的基本概念 二叉树 遍历二叉树和线索二叉树 树和森林 赫夫曼树及其应用
2
6.1
1.
2 3. 4. 5.
树的基本概念
24
3. 二叉树的存储结构
一、顺序存储结构 按二叉树的结点“自上而 B 下、从左至右”编号,用 一组连续的存储单元存储。 D E
H I A
T[0]一 般不用
C F G
问:顺序存储后能否复原成唯一对应的二叉树形状? 答:若是完全/满二叉树则可以做到唯一复原。 而且有规律:下标值为i的双亲,其左孩子的下标值必为 2i,其右孩子的下标值必为2i+1(即性质5) 例如,对应[2]的两个孩子必为[4]和[5],即B的左孩子必 是D,右孩子必为E。
(除根结点外,每个结点必有一个直接前趋,即一个分支)
而 总分支数B= n1+2n2 (1度结点必有1个直接后继,2度结点必有2个)
三式联立可得: n0+n1+n2= n1+2n2 +1, 即n0=n2+1
数据结构第六章

K
L
M
任何一棵非空树是一个二元组 Tree = (root,F) 其中:root 被称为根结点, F 被称为子树森林
6.2 二叉树
定义
定义:二叉树是n(n0)个结点的有限集,它或为空树 (n=0),或由一个根结点和两棵分别称为左子树和右子树 的互不相交的二叉树构成 二叉树,度为2的树? 特点
树和二叉树
树是一类重要的非线性数据结构,以分支 关系描述数据元素之间的层次结构 6.1 树 定义: 树(tree)是n(n≥0)个结点的有限集。在任意一棵非
空树中:
有且仅有一个特殊的结点,称为树的根结点(root)
当n>1时,除根结点之外的其余结点可分为
m(m>0)个 互不相交的有限集合T1,T2,……Tm,其 中每一个集合本身又是一棵树,称为根的子树 (subtree)
证明:用归纳法证明之 i=1时,只有一个根结点,2i-1 = 20 = 1; 假设对所有j(1j<i)命题成立,即第j层上至多有2j-1 个结 点,那么,第i-1层至多有2i-2个结点 又二叉树每个结点的度至多为2 第i层上最大结点数是第i-1层的2倍,即2i-2 2 = 2i-1 故命题得证 k 性质2:深度为k的二叉树至多有 2 1 个结点(k1) 证明:由性质1,可得深度为k 的二叉树最大结点数是
基本操作 P :
插入类:
InitTree(&T) // 初始化臵空树 CreateTree(&T, definition) // 按定义构造树 Assign(T, cur_e, value) // 给当前结点赋值 InsertChild(&T, &p, i, c) // 将以c为根的树插入为 结点p的第i棵子树
数据结构肖启宏课后习题答案第六章

一.名词解释(1)结点—— 树的结点包含一个数据及若干指向其子树的分支。
(2)结点的度—— 结点所拥有的子树数称为该结点的度。
(3)树的度—— 树中各结点度的最大值称为该树的度。
(4)二叉树—— 一棵非空的二叉树,每个结点至多只有两棵子树,分别称为左子树和右子树,左、右子树的次序不能任意交换,且左右子树又分别是一棵二叉树。
(5)哈夫曼树—— 带权路径长度最小的二叉树,即最优二叉树,也称为哈夫曼树。
二.判断题(下列各题,正确的请在前面的括号内打√;错误的打ㄨ) (1)√ (2)ㄨ (3)√ (4)√(5)√(6)ㄨ (7)ㄨ(8)√三.填空题1.结点拥有的子树数 2.度为零的3. 树内各结点度的最大值 4.深度(或高度) 5.2i-1 6. 2h -1 7. n-1 8.6 9.中序 10.5 11.20 12. ⎣⎦1log 2+n13.顺序存储结构和链式存储结构 14.最小 15.EBCAD16.(1) ABEFHCG (2).EBHFACG (3).EHFBGCA 17.空二叉树 18.4四.选择题(1)B (2)C (3)C (4)C (5)D(6)B (7)A (8)B (9)D (10)D(11)B (12)A (13)C五.简答题1.答:一般树(非空)除了根结点之外,每个结点有且仅有一个前驱结点,但每个结点都可以有多个互不相交的子集(后继结点)。
二叉树(若非空)除了根结点之外,每个结点有且仅有一个前驱结点,但每个结点至多只有两个后继结点,称为左子树和右子树,左、右子树的次序不能交换,且左右子树又分别都是二叉树。
一般树和二叉树主要有以下区别:二叉树结点的度最大为2,而一般树结点的最大度数无限制;一般树的结点无左、右之分,而二叉树的结点有左、右之分。
2.答:一棵度为2的树与一棵二叉树的区别在于:对于度为1的结点,度为2的树无须区分左右;对于二叉树必须有左右之分,且不能任意交换。
3.答:(1)A是根结点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6.2.3 平均搜索长度 搜索中所需的关键字值之间的比较次数的 期望值,被称为搜索算法的平均搜索长度 期望值,被称为搜索算法的平均搜索长度 ( average search length ASL) .
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
求成功搜索的平均搜索长度, 求成功搜索的平均搜索长度,需要给定表 中元素a 被搜索的概率p 设表长为n 中元素ai被搜索的概率pi.设表长为n,假 定每个元素的搜索概率是相等的, =1/n, 定每个元素的搜索概率是相等的,即pi=1/n, 则程序6.3 则程序6.3 在搜索成功时的平均搜索长度 为:
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
6.1.2 动态集 动态集ADT
ADT DynamicSet { 数据: 数据: 同类元素的有限汇集,其最大允许长度为MaxSetSize.元 同类元素的有限汇集,其最大允许长度为 . 素由关键字标识,集合的元素各不相同. 素由关键字标识,集合的元素各不相同. 运算: 运算: Create();创建一个空集合. 创建一个空集合. 创建一个空集合 Destroy():撤消一个集合. :撤消一个集合. IsEmpty():若集合为空,则返回 若集合为空, 若集合为空 则返回true,否则返回 ,否则返回false. . IsFull():若集合满,则返回 若集合满, 若集合满 则返回true,否则返回 ,否则返回false. .
1 n1 1 n n+ 1 ASLS = ∑( i + 1 ) = ∑i = n i =0 n i =1 2
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
设有序表为( 设有序表为(a0,a1,…,an-1),通常可以假 ,a 定待查元素的值位于a 之前, 之间, 定待查元素的值位于a0之前,a0与a1之间, 之间, ,a a1 与 a2 之间 ,…,an-2 与 an - 1 之间以及 an - 1 之 后的共n+ 个区间内的概率是相等的. n+1 后的共n+1个区间内的概率是相等的.程序 6.4搜索失败的平均搜索长度为: 搜索失败的平均搜索长度为: 搜索失败的平均搜索长度为
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
template <class T> class DynamicSet { public: public: virtual ResultCode Search(T& x)const=0; virtual ResultCode Insert(T& x)=0; virtual ResultCode Remove(T& x)=0; virtual bool IsEmpty()const=0; virtual bool IsFull()const=0; };
数据结构
Data Structures in C++
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
第6章 集合和搜索
南京邮电大学计算机学院 陈 基本概念 6.2 顺序搜索 6.3 二分搜索
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
Search(x): 在表中搜索与x的关键字值相同的元素 Search(x): 在表中搜索与 的关键字值相同的元素 . 的关键字值相同的元素. 如果存在该元素,则将其值赋给x, 如果存在该元素,则将其值赋给 ,并且函数返回 Success;否则返回 ;否则返回NotPresent. . Insert(x):在表中搜索与x的关键字值相同的元素 Insert(x):在表中搜索与 的关键字值相同的元素. 的关键字值相同的元素. 若表中存在该元素, 则将其值赋给x, 若表中存在该元素 , 则将其值赋给 , 函数返回 Duplicate . 否 则 , 若 表 已 满 , 则 函 数 返 回 Overflow;若表未满,则在表中插入值为 的元素, 的元素, ;若表未满,则在表中插入值为x的元素 函数返回Success. 函数返回Success. Remove(x):在表中搜索与x的关键字值相同的元素 Remove(x):在表中搜索与 的关键字值相同的元素. 的关键字值相同的元素. 如果存在该元素,则将其值赋给x, 如果存在该元素,则将其值赋给 ,并从表中删除 之,函数返回Success;否则返回NotPresent. 函数返回 ;否则返回 . } 函数返回类型为: 函数返回类型为: enum ResultCode{ Underflow,Overflow,Success, ResultCode Duplicate,NotPresent, ... };
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
集合结构(简称集合)作为一种数据结构, 集合结构(简称集合)作为一种数据结构,我 集合 们将它视为同类型数据元素的汇集 汇集. 们将它视为同类型数据元素的汇集.集合的数据 元素之间除了"同属于一个集合" 元素之间除了"同属于一个集合"的联系之外没 有其它关系.一般地, 有其它关系.一般地,我们假定所讨论的集合不 包含相同元素. 包含相同元素.数据结构意义上的集合通常是动 态的,在集合中可以插入和删除元素,因而被称 态的,在集合中可以插入和删除元素, 为动态集 .
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
6.2.2 有序表的顺序搜索
template <class T> ResultCode ListSet<T>::Search(T& x)const //当l[i]的关键字值大于等于 的关键字值时, 的关键字值大于等于x { //当l[i]的关键字值大于等于x的关键字值时,出循环
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
搜索算法分类 搜索算法可以按元素是否全部在内存分为: 搜索算法可以按元素是否全部在内存分为 : 内搜 外搜索.我们将对表的搜索称为内搜索 内搜索, 索 和外搜索.我们将对表的搜索称为内搜索,而对文 件的搜索称为外搜索 外搜索. 件的搜索称为外搜索. 如果一个搜索算法只是单纯搜索一个元素, 如果一个搜索算法只是单纯搜索一个元素 , 称为 静态搜索, 如果在搜索不成功时, 静态搜索 , 如果在搜索不成功时 , 需将被搜索的元素 动态搜索, 插入表中, 这样的搜索被称为动态搜索 插入表中 , 这样的搜索被称为 动态搜索 , 这种将搜索 和插入结合起来的算法常称为符号表算法 符号表算法, 和插入结合起来的算法常称为 符号表算法 , 被编译程 序用于构造标识符表. 序用于构造标识符表. 搜索算法还可以根据算法中是否以关键字值间的比 较为基础, 或由关键字值直接计算元素地址, 分为基 较为基础 , 或由关键字值直接计算元素地址 , 分为 基 的搜索, 于关键字比较的搜索 基于计算地址的搜索 的搜索和 于关键字比较 的搜索 和 基于计算地址 的搜索 , 本章和 章的搜索属于前者, 10章的散列表搜索属于后者 第9章的搜索属于前者,第10章的散列表搜索属于后者
6.2.1 无序表的顺序搜索
template <class T> ResultCode ListSet<T>::Search(T& x)const { for (int i=0;i<n;i++) if (l[i]==x) { x=l[i]; return Success; //搜索成功 搜索成功 } return NotPresent; //搜索失败 搜索失败 }
6.1 基本概念
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
6.1.1 集合和搜索的概念
在数学上, 是不同对象的无序汇集 在数学上,集合 是不同对象的无序汇集 ,集合 的对象称为元素 成员, 元素或 的对象称为元素或成员,每个元素仅出现一 是元素的无序汇集,其中, 多重集 是元素的无序汇集,其中,每个元素可出 现一次或多次.例如, 现一次或多次.例如, 多重集 {1, 1, 2, 3} 与 1}相同 相同, 3}不同 不同. {1, 2, 3, 1}相同,但与 {1, 2, 3}不同. 通常用大括号表示无序集 大括号表示无序集. 通常用大括号表示无序集. 一个有序集是元素的汇集,其中, 有序集是元素的汇集 一个有序集是元素的汇集,其中,每个元素可以 出现一次或多次, 出现一次或多次,并且它们的出现次序是重要的 如同向量一样).通常用圆括号表示有序集, ).通常用圆括号表示有序集 (如同向量一样).通常用圆括号表示有序集, 例如,( ,(2 例如,(2,1,3).
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
关键字是用以标识一个数据元素的某个数据项. 关键字是用以标识一个数据元素的某个数据项. 是用以标识一个数据元素的某个数据项 若此关键字可以惟一标识一个元素, 若此关键字可以惟一标识一个元素,则称此关键 主关键字.集合中, 字为主关键字.集合中,不同数据元素有不同的主 关键字值. 关键字值. 称可用以识别若干数据元素的关键字为次关键字 次关键字. 称可用以识别若干数据元素的关键字为次关键字. 当数据元素是初等数据类型时, 当数据元素是初等数据类型时,其关键字值即数据 元素值. 元素值. 在本章讨论中,若非特殊说明, 在本章讨论中,若非特殊说明,都假定被搜索的 关键字为主关键字. 关键字为主关键字.
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
搜索:根据给定的某个值, 搜索:根据给定的某个值,在表中确定一个关键字值 等于给定值的数据元素, 若表中存在这样的元素, 等于给定值的数据元素 , 若表中存在这样的元素 , 则 搜索成功, 搜索结果可以返回整个数据元素, 称 搜索成功 , 搜索结果可以返回整个数据元素 , 也可 指示该元素在表中的地址; 指示该元素在表中的地址 ; 若表中不存在关键字值等 搜索不成功( 搜索失败) 于给定值的元素, 则称搜索不成功 也称搜索失败 于给定值的元素 , 则称 搜索不成功 ( 也称 搜索失败 ) .