第五章 树和二叉树二
《数据结构及其应用》笔记含答案 第五章_树和二叉树
第5章树和二叉树一、填空题1、指向结点前驱和后继的指针称为线索。
二、判断题1、二叉树是树的特殊形式。
()2、完全二叉树中,若一个结点没有左孩子,则它必是叶子。
()3、对于有N个结点的二叉树,其高度为。
()4、满二叉树一定是完全二叉树,反之未必。
()5、完全二叉树可采用顺序存储结构实现存储,非完全二叉树则不能。
()6、若一个结点是某二叉树子树的中序遍历序列中的第一个结点,则它必是该子树的后序遍历序列中的第一个结点。
()7、不使用递归也可实现二叉树的先序、中序和后序遍历。
()8、先序遍历二叉树的序列中,任何结点的子树的所有结点不一定跟在该结点之后。
()9、赫夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近。
()110、在赫夫曼编码中,出现频率相同的字符编码长度也一定相同。
()三、单项选择题1、把一棵树转换为二叉树后,这棵二叉树的形态是(A)。
A.唯一的B.有多种C.有多种,但根结点都没有左孩子D.有多种,但根结点都没有右孩子解释:因为二叉树有左孩子、右孩子之分,故一棵树转换为二叉树后,这棵二叉树的形态是唯一的。
2、由3个结点可以构造出多少种不同的二叉树?(D)A.2 B.3 C.4 D.5解释:五种情况如下:3、一棵完全二叉树上有1001个结点,其中叶子结点的个数是(D)。
A.250 B. 500 C.254 D.501解释:设度为0结点(叶子结点)个数为A,度为1的结点个数为B,度为2的结点个数为C,有A=C+1,A+B+C=1001,可得2C+B=1000,由完全二叉树的性质可得B=0或1,又因为C为整数,所以B=0,C=500,A=501,即有501个叶子结点。
4、一个具有1025个结点的二叉树的高h为(C)。
A.11 B.10 C.11至1025之间 D.10至1024之间解释:若每层仅有一个结点,则树高h为1025;且其最小树高为⎣log21025⎦ + 1=11,即h在11至1025之间。
数据结构第5章课件 中国石油大学(华东)
二叉链表
leftChild
data rightChild
22
二叉树的链表表示(三叉链表)
每个结点增加一个指向双亲的指针parent,使 得查找双亲也很方便。
leftChild data parent rightChild
三叉链表
data
leftChild
27
BinTreeNode *LeftChild (BinTreeNode *current ) { return (current != NULL )? current->leftChild :NULL; } BinTreeNode *RightChild (BinTreeNode *current ) { return ( current!= NULL) ? current->rightChild : NULL; } int Height( ){return Height(root);} int Size( ){return Size(root);} BinTreeNode *GetRoot ( ) const { return root; } void preOrder( ) {preOrder(root);} //前序遍历 void inOrder( ) {inOrder(root);} //中序遍历 void postOrder( ) {postOrder(root);} //后序遍历 void levelOrder( ) ; // 不需要递归,所以直接对外接 口调用即可。层序遍历 28
b
f
c
d
g
6
e
a
b.嵌套集合表示法: b 根据树的集合定义,写出集合划分。 { a, {b,{e},{f}}, {c}, {d,{g}} } e c d
数据结构 第五章树答案
第五章 树(答案)一、选择题1、二叉树的第i 层最多有( )个结点。
A .2i B. 2i C. 2i-1 D.2i -12.对于一棵满二叉树,高度为h ,共有n 个结点,其中有m 个叶子结点,则( )A .n=h+m B.h+m=2n C.m=h-1 D.n=2h -1 3.在一棵二叉树中,共有16个度为2的结点,则其共有( )个叶子结点。
A .15 B.16 C.17 D.184. 一棵完全二叉树中根结点的编号为1,而且编号为23的结点有左孩子但没有右孩子,则此树中共有( )个结点。
A .24 B.45 C.46 D.47 5.下述编码那一组不是前缀码( )A .00,01,10,11 B.0,1,00,11 C.0,10,110,111 D.1,01,001,000 6.某二叉树的中序序列和后序序列相同,则这棵二叉树必然是( )A .空树B .空树或任一结点均无左孩子的非空二叉树C .空树或任一结点均无右孩子的非空二叉树D .空树或仅有一个结点的二叉树7.设n,m 为一棵二叉树上的两个结点,在中序遍历时,n 在m 前的条件是( )A .n 在m 的右边 B.n 是m 的祖先C .n 在m 的左边 D.n 是m 的子孙8、假定中根遍历二叉树的定义如下:若二叉树为非空二叉树,则中根遍历根的右子树;访问根结点;中根遍历根的左子树。
按此定义遍历下图所示的二叉树,遍历的结果为: A 、 DBEAFHGC A B 、 C GHFADBE B C C 、 E BDAFHGC E D FD 、 FHGCADBE GH9、文中出现的字母为A 、B 、C 、D 和E ,每个字母在电文中出现的次数分别为9、27、3、5和11。
按哈夫曼编码(构造时左小右大),则字母C 的编码应是:A 、10B 、0110C 、1110D 、1100 10、设树T 的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1 则T 中的叶子数为( )A .5B .6C .7D .8 11.算术表达式a+b*(c+d/e )转为后缀表达式后为( )A .ab+cde/*B .abcde/+*+C .abcde/*++D .12. 设有一表示算术表达式的二叉树(见下图),它所表示的算术表达式是( )A. A*B+C/(D*E)+(F-G)B. (A*B+C)/(D*E)+(F-G)C. (A*B+C)/(D*E+(F-G ))D. A*B+C/D*E+F-G13.已知一算术表达式的中缀形式为 A+B*C-D/E ,后缀形式为ABC*+DE/-,其前缀形式为( ) A .-A+B*C/DE B. -A+B*CD/E C .-+*ABC/DE D. -+A*BC/DE14.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是( )A .9B .11C .15D .不确定15.树的后根遍历序列等同于该树对应的二叉树的( ).A. 先序序列B. 中序序列C. 后序序列16.已知一棵二叉树的前序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历的结果为( )。
第五章二叉树
树为空
树为空
根的左右子 树都不空
二、二叉树的性质
第1层(根) 第2层 第3层
第4层
1、若层次从1开始,则第i层最多有2 i-1个结点 2、高度为h的二叉树最多有2h -1个结点 3、任何一棵二叉树,若叶子结点数为n0,度为2的结点数 为n2,则n0 = n2 + 1
5.2.2 二叉树的性质
二叉树具有下列重要性质: 性质1: 在二叉树的第i层上至多有2i-1个结点(i>=1)。
二叉树的二叉链表存储表示
Elem val(){return data;} void setVal(const Elem e){data=e;} inline BinTreeNode<Elem>* left(){return lchild;} inline BinTreeNode<Elem>* right(){return rchild;} void setLeft(BinTreeNode<Elem>* left){lchild=left;} void setRight(BinTreeNode<Elem>* right){rchild=right;} bool isLeaf()
Elem data; BinTreeNode * lchild; BinTreeNode * rchild; public:
BinTreeNode(){lchild=rchild=NULL;} BinTreeNode(Elem e,BinNodePtr*l=NULL,
BinNodePtr*r=NULL) {data=e; lchild=l; rchild=r;} ~BinTreeNode(){}
n0,度为2的结点数为n2,则n0=n2+1。
计算机二级考点归纳(树与二叉树)
•1、树的基本概念树(tree)是一种简单的非线性结构。
在树结构中,每一个结点只有一个前件,称为父结点,没有前件的结点只有一个,称为树的根结点。
每一个结点可以有多个后件,它们称为该结点的子结点。
没有后件的结点称为叶子结点。
在树结构中,一个结点所拥有的后件个数称为该结点的度。
叶子结点的度为 0。
在树中,所有结点中的最大的度称为树的度。
• 2、二叉树及其基本性质(1)二叉树的定义二叉树是一种很有用的非线性结构,具有以下两个特点:①非空二叉树只有一个根结点;②每一个结点最多有两棵子树,且分别称为该结点的左子树和右子树。
由以上特点可以看出,在二叉树中,每一个结点的度最大为2,即所有子树(左子树或右子树)也均为二叉树,而树结构中的每一个结点的度可以是任意的。
另外,二叉树中的每个结点的子树被明显地分为左子树和右子树。
在二叉树中,一个结点可以只有左子树而没有右子树,也可以只有右子树而没有左子树。
当一个结点既没有左子树也没有右子树时,该结点即为叶子结点。
(2)二叉树的基本性质二叉树具有以下几个性质:性质1:在二叉树的第k层上,最多有2k-1(k≥1)个结点;性质2:深度为m的二叉树最多有2m-1个结点;性质3:在任意一棵二叉树中,度为0的结点(即叶子结点)总是比度为2的结点多一个。
性质4:具有n个结点的二叉树,其深度至少为[log2n]+1,其中[log2n]表示取log2n的整数部分。
在二叉树的遍历中,无论是前序遍历,中序遍历还是后序遍历,二叉树的叶子结点的先后顺序都是不变的。
3、满二叉树与完全二叉树满二叉树是指这样的一种二叉树:除最后一层外,每一层上的所有结点都有两个子结点。
在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第k层上有2k-1个结点,且深度为m的满二叉树有2m-1个结点。
完全二叉树是指这样的二叉树:除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。
对于完全二叉树来说,叶子结点只可能在层次最大的两层上出现:对于任何一个结点,若其右分支下的子孙结点的最大层次为p,则其左分支下的子孙结点的最大层次或为p,或为p+1。
数据结构详细教案——树与二叉树
数据结构详细教案——树与二叉树一、教学目标1.了解树和二叉树的基本概念和特点;2.掌握树和二叉树的基本操作;3.能够通过递归遍历树和二叉树。
二、教学重难点1.树和二叉树的基本概念和特点;2.递归遍历树和二叉树。
三、教学内容1.树的概念和特点1.1树的定义树是n(n>=0)个节点的有限集。
当n=0时,称为空树;如果不为空树,则1. 树有且仅有一个特殊节点被称为根(Root);2.其余节点可分为m(m>0)个互不相交的有限集T1,T2,...,Tm,其中每个集合又是一棵树。
1.2节点间的关系- 父节点(parent)是当前节点的直接上级节点;- 子节点(child)是当前节点的直接下级节点;- 兄弟节点(sibling)是具有同一父节点的节点;- 祖先节点(ancestor)是通过从当前节点到根的任意路径可以到达的节点;- 子孙节点(descendant)是通过从该节点到子树的任意节点可以到达的节点。
1.3树的特点-树是一个有层次的结构,可以看作是一个鱼骨图;-树中的每个节点都可以有多个子节点,但只有一个父节点;-树中的节点之间是唯一的,不存在重复节点;-树中的任意两个节点之间都有且仅有一条路径连接。
2.二叉树的概念和特点2.1二叉树的定义二叉树是一种特殊的树结构,它的每个节点最多只能有两个子节点,分别称为左子节点和右子节点。
2.2二叉树的特点-二叉树的度最大为2,即每个节点最多有两个子节点;-二叉树的第i层最多有2^(i-1)个节点;-对于任意一颗二叉树,如果其叶子节点数为n0,度为2的节点数为n2,则有n0=n2+1;-完全二叉树是一种特殊的二叉树,除了最后一层的叶子节点外,每一层的节点都是满的。
四、教学过程1.讲解树和二叉树的基本概念和特点,引导学生理解树和二叉树的定义和节点间的关系。
2.分析树和二叉树的基本操作,并通过实例演示操作过程,让学生掌握操作的步骤和方法。
3.运用递归算法遍历树和二叉树的过程,详细讲解前序遍历、中序遍历和后序遍历的定义和实现方法。
《数据结构》第五章习题参考答案
《数据结构》第五章习题参考答案一、判断题(在正确说法的题后括号中打“√”,错误说法的题后括号中打“×”)1、知道一颗树的先序序列和后序序列可唯一确定这颗树。
( ×)2、二叉树的左右子树可任意交换。
(×)3、任何一颗二叉树的叶子节点在先序、中序和后序遍历序列中的相对次序不发生改变。
(√)4、哈夫曼树是带权路径最短的树,路径上权值较大的结点离根较近。
(√)5、用一维数组存储二叉树时,总是以前序遍历顺序存储结点。
( ×)6、完全二叉树中,若一个结点没有左孩子,则它必是叶子结点。
( √)7、一棵树中的叶子数一定等于与其对应的二叉树的叶子数。
(×)8、度为2的树就是二叉树。
(×)二、单项选择题1.具有10个叶结点的二叉树中有( B )个度为2的结点。
A.8 B.9 C.10 D.112.树的后根遍历序列等同于该树对应的二叉树的( B )。
A. 先序序列B. 中序序列C. 后序序列3、二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK;中序遍历:HFIEJKG 。
该二叉树根的右子树的根是:( C )A. EB. FC. GD. H04、在下述结论中,正确的是( D )。
①具有n个结点的完全二叉树的深度k必为┌log2(n+1)┐;②二叉树的度为2;③二叉树的左右子树可任意交换;④一棵深度为k(k≥1)且有2k-1个结点的二叉树称为满二叉树。
A.①②③B.②③④C.①②④D.①④5、某二叉树的后序遍历序列与先序遍历序列正好相反,则该二叉树一定是( D )。
A.空或只有一个结点B.完全二叉树C.二叉排序树D.高度等于其结点数三、填空题1、对于一棵具有n个结点的二叉树,对应二叉链接表中指针总数为__2n____个,其中___n-1_____个用于指向孩子结点,___n+1___个指针空闲着。
2、一棵深度为k(k≥1)的满二叉树有_____2k-1______个叶子结点。
5-5-数据结构——从概念到C++实现(第3版)-王红梅-清华大学出版社
5-5-1 二叉树的顺序存储结构
二叉树的顺序存储结构
顺序存储结构的要求是什么?
用一组连续的存储单元依次存储数据元素,由存储位置表示元素之间的逻辑关系
数
据
结
构
二叉树的顺序存储结构是用一维数组存储二叉树的结点,结点的
( 从 概
念
存储位置(下标)应能体现结点之间的逻辑关系——父子关系
对于普通的二叉树,如何顺序存储呢?
A1
将二叉树按完全二叉树编号: (1)根结点的编号为 1 (2)若某结点 i 有左孩子,则其左孩子 的编号为 2i (3)若某结点 i 有右孩子,则其右孩子 的编号为 2i+1
B2
C3
数
据
结
构
D5
F6
( 从 概
念
10 E
到
实
G 13
现 )
清
华
大
以编号
学 出
版
为下标
社
BiTree( ){root = Creat(root);}
~BiTree( ){Release(root);}
数 据
结
void PreOrder( ){PreOrder(root);}
构 (
void InOrder( ){InOrder(root);}
从 概
念
void PostOrder( ){PostOrder(root);}
BiNode
数
{
据 结
构
DataType data;
( 从
概
BiNode< DataType > *lchild, *rchild;
念 到
实
第5章 树和二叉树
B A
C
D
E
F
G
H
I
J
K
L
T1
T2
M
2015年10月20日
T3
树的其它表示方式
A D K L F C G E B H M J I
A
A B E K L F C G
B C D
嵌套集合
E
D H M
F
G
H
I
J
I J
K
L
M
凹入表示
(A(B(E(K,L),F),C(G),D(H(M),I,J)))
广义表
2015年10月20日
北京林业大学信息学院
2015年10月20日
二叉树的链式存储
PARENT
lchild
data
rchild
DATA
lchild
data
parent rchild
LCHILD
RCHILD
北京林业大学信息学院
2015年10月20日
二叉链表
A A ^ B D lchild data rchild
B
C
E
G
F
二叉树的五种不同形态
2015年10月20日
练习
具有3个结点的二叉树可能有几种不同形态?普通树呢? 5种/2种
2015年10月20日
二叉树的抽象数据类型定义
ADT BinaryTree{ 数据对象D: D是具有相同特性的数据元素的集合。 数据关系R: 若D=Φ,则R= Φ ; 若D≠Φ,则R= {H};存在二元关系: ① root 唯一 //关于根的说明 ② Dj∩Dk= Φ //关于子树不相交的说明 ③ …… //关于数据元素的说明 ④ …… //关于左子树和右子树的说明 //至少有20个 基本操作 P: }ADT BinaryTree
广东药科大学-2019年-硕士研究生入学考-《数据结构》考试大纲
广东药科大学硕士研究生入学统一考试
《数据结构》考试大纲
《数据结构》是计算机程序设计的重要理论和实践基础课。
本课程讨论软件设计中经常遇到的线性表、堆栈、队列、串、数组、二叉树、图等典型数据结构的设计方法以及各种典型排序和查找算法的性能和设计方法,并介绍各种典型数据结构的应用。
要求考生了解数据的逻辑结构和物理结构之间的关系,数据结构和数据类型的关系,熟悉各种基本数据结构的概念特点存储结构,掌握排序和查找算法的分析方法,根据实际问题提出的要求学会如何选择合理的排序和查找算法,能综合利用数据结构进行算法设计和C语言进行编程实现。
第一章绪论
1.数据、数据元素、数据逻辑结构、数据存储结构、数据类型、抽象数据类型等;
2.算法、算法设计的要求、算法效率的度量、算法存储空间的需求等
3. 抽象数据类型的表示和实现。
第二章线性表
1.线性表的定义和基本概念
2. 线性表的实现,包括顺序和链式存储结构
3.线性表的应用
第三章栈和队列
1.栈和队列的定义和基本概念
2.栈和队列的实现,包括顺序和链式存储结构
3.栈和队列的应用。
5-7-数据结构——从概念到C++实现(第3版)-王红梅-清华大学出版社
) 清
华
大
须存储哪些关系呢?
9
5
学 出 版
社
选取根结点权值最小的二叉树
存储parent信息
4 52 3
作为左右子树进行合并
存储lchild和rchild信息
哈夫曼算法
【算法——数据表示】如何存储哈夫曼树呢?
struct ElemType
{
int weight;
/*假定权值为整数*/
int parent, lchild, rchild;
的二叉树加入到F中;
哈夫曼算法
哈夫曼算法的运行实例
初始化 选取与合并
删除与加入
例 给定权值集合{2,4,5 ,3}
2453
数
据
结
构
(
从
概
念
5
到 实 现
)
清
华
23
大 学
出
版
社
45
5
23
哈夫曼算法
哈夫曼算法的运行实例
例 给定权值集合{2,4,5 ,3}
选取与合并 删除与加入
45
5
23
9
45
9
5
数
据
结
}
( 从 概
for (i = 0; i < n; i++)
/*构造n棵只含有根结点的二叉树*/
念 到
huffTree[i].weight = w[i]; for (k = n; k < 2*n-1; k++) /*n-1次合并*/
};
weight
lchild
rchild
parent
数 据
结
第五章习题
三、填空题
9. n个结点的各棵树中,其深度最小的那棵树的深度 是 2 。它共有 n-1 个叶子结点和 1 个非叶子结点, 其中,深度最大的那棵树的深度是 n ,它共有 1 个 叶子结点和 n-1 个非叶子结点。
10.先根遍历树林正好等同于 先序 遍历对应的二叉树,后 根遍历树林正好等同于按 中序 遍历对应的二叉树。 11.若一个二叉树的叶子结点是某子树的中序遍历序列中的 前序 最后一个结点,则它必是该子树的______序列中的最后一个 结点。
C,E,F,G,
二、判断题
× 1.二叉树是度为2的有序树。
× 2. 完全二叉树一定存在度为1的结点。 √
√
3.深度为K的二叉树中结点总数≤2k-1。 4. 一个树的叶结点,在前序遍历和后序遍历 下,皆以相同的相对位置出现。 但是,如果我们还知道该树的根结点是哪一个, 则可以确定这棵二叉树。 一个栈。
C A
10.深度为h的满m叉树的第k层有( )个结 点。(1=<k=<h) A.mk-1 B.mk-1 C.mh-1 D.mh-1
一、选择题
11.高度为 K的二叉树最大的结点数为( A.2k B.2k-1 C.2k -1 D.2k-1-1 12. 一棵树高为K的完全二叉树至少有( A.2k –1 B. 2k-1 –1 C. 2k-1 D. 2k )。
第五章 树和二叉树
习题讨论
、选择题
1.已知一算术表达式的中缀形式为 A+B*C-D/E,后缀形式 为ABC*+DE/-,其前缀形式为( ) A.-A+B*C/DE B. -A+B*CD/E C.-+*ABC/DE D. -+A*BC/DE
D
C
2. 设有一表示算术表达式的二叉树(见下图),它所表示的算 术表达式是( ) A. A*B+C/(D*E)+(F-G) / B. (A*B+C)/(D*E)+(F-G) + + C * C. (A*B+C)/(D*E+(F-G)) * D E F G D. A*B+C/D*E+F-G A B
数据结构复习题3
数据结构练习题第一章绪论一.选择题1、在数据结构的讨论中把数据结构从逻辑上分为()。
A.内部结构与外部结构B.静态结构与动态结构C.线性结构与非线性结构D.紧凑结构与非紧凑结构2、采用线性链表表示一个向量时,要求占用的存储空间地址()。
A: 必须是连续的 B 部分地址必须是连续的C: 一定是不连续的C: 可连续可不连续3、采用顺序搜索方法查找长度为n的顺序表时,搜索成功的平均搜索长度为()。
A: n B: n/2 C: (n-1)/2 D: (n+1)/24、在一个单链表中,若q结点是p结点的前驱结点,若在q与p之间插入结点s,则执行()。
A: s→next = p→next;p→next = s; B: p→next= s; s→next = q;C: p→next = s→next;s→next = p;D: q→next= s;s→next= p;8.下面程序段的时间复杂度为____________。
for(int i=0; i<m; i++)for(int j=0; j<n; j++)a[i][j]=i*j;A、 O(m2)B、 O(n2)C、 O(m*n)D、 O(m+n)9.执行下面程序段时,执行S语句的次数为____________。
for(int i=1; i<=n; i++)for(int j=1; j<=i; j++)S;A、 n2B、 n2/2C、 n(n+1)D、 n(n+1)/2二.填空题1.通常,评价一个算法有正确性、健壮性、_________、时间复杂度、空间复杂度五个方面。
2.在数据结构中,数据的逻辑结构有线性结构、图结构、________________、_______________四种,物理实现上有顺序结构、索引结构、___________、_____________四种。
第三章线性表一.选择题1.在一个单链表HL中,若要向q所指结点之后插入一个指针p指向的结点,则执行.A. HL=p; p->next=HLB. P->next=HL; HL=pC. P->next=q->next; q->next=pD. P->next=q->next; q=p->next2.在一个长度为n的顺序存储线性表中,向第i个元素(1≤i≤n+1)之前插入一个新元素时,需要从后向前依次后移个元素。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
data 25 16 37 8 30 48 28 32 60 26 29 35
left 1 2 4 5 0 7 0 10 0 0 0 0 0
right 13 3 0 6 0 8 9 11 12 0 0 0 0 14 0
7.写出对图5-3所示的二叉树分另按前序、中序、后序遍历时得到的结点序列。
,那么度为0的结点数有 6 个。
5.一棵深度为5的满二叉树中的结点数为 31 个,一棵深度为3的满四叉树中的结点数为
21 个。
6.假定一棵树的广义表示为A(B(C,D(E,F,G),H(I,J))),则树中所含的结点数为 10
个,树的深度为 4 个,树的度为 3 。
7.假定一棵树的广义表表示为A(B(C,D(E,F,G),H(I,J))),则度为3,2,1,0的结点数分
//分别统计出二叉树中所有结点数和叶子结点数
{
if(BT!=NULL){
C1++;//统计所有结点
if(BT->left==NULL&&BT->right==NULL)
C2++; //统计叶子结点数
if(2*i<n){
cout<<"left child:"<<A[2*i]<≪end1;
cout<<"right child:"<<A[2*i+1]<<end1;
}
{
if(i>n){
cerr<<"编号为"<<i<<"的结点不存在!"<<end1;
exit(1);
}
cout<<"current element:"<<A[i]<<end1;
Count(BT->left,C1,C2);
Count(BT->right,C1,C2);
}
}
10.编写具有下列功能的每个函数:
把在内存中生成的一棵二叉树写入到一个磁盘文件中,该函数声明为
void WriteFile(char* fname,BTreeNode*BT);
BTreeNode* p=BT;//定义指针p并使树根指针为它的初值
while(top!=-1||p!=NULL)
{//当栈非空或p指针非空时执行循环
while(p!=NULL){
top++;
int j=i/2; //下标为j的结点是下标为i结点的双亲
if(j>0)
cout<<"parent:"<<A[j]<<end1;
else
cout<<"树根结点没有双亲结点!"<<end1;
/ \ / / \ \
b c b b b b
/ \ / \
c c c c
解:
void InorderN(BTreeNode*BT)
//对二叉树进行中序遍历的非递归算法
{
BTreeNode* s[10];//定义用于存储结点指针的栈
int top=-1;定义栈顶指针并赋初值使s栈为空
28 32 60
/ \ \
26 29 35
在数组中的二叉树存储映像如下所示。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 ...BTreeMaxSize
应的存储位置为 2j+1 。
18.若对一棵二叉树从0开始进行结点编号,并按此编号把它顺序存储到一维数组a中,
即编号为0的结点存储到a[0]中,其余类推,则a[i]元素的左孩子元素为 a[2i+1] ,
右孩子元素为 a[2i+2] ,双亲元素(i->0)为 a[(i-1)/2] 。
19.对于一棵具有n个结点的二叉树,对应二叉链接表中指针总数为 2n 个,其中
结点数=n0+n1+n2+...+nm
总度数=n1+2n2+...+m×nm
根据树的性质1可知,结点数等于总度数加1,所以得到
m
n0=1+∑((i-1)×ni)
i=2
含有 2h-1个结点。
23.假定一棵二叉树广义表表示为a(b(c),d(e,f)),则对它进行的先序遍历结果为 a b c d e f
,中序遍历结果为 c b a e d f,后序遍历结果为 c b e f d a,按层遍历结果为 a b
d c e f。
24.假定一棵普通树的广义表表示为a(b((e),c(f(h,i,j),g),d),则先根遍历结果为 a b e c
孩子元素为 a[2i+1] ,双亲元素(i-1)为 a[i/2] 。
17.假定一棵二叉树顺序存储在一维数组a中,但让编号为1的结点存入a[0]元素中,
让编号为2的结点存入a[1]元素中,其余类推,则编号为i结点的左孩子结点对应的
存储位置为 2i-1 ,若编号为i结点的存储位置用j表示,则其左孩子结点对
结点的编号为 2i+1 ,双亲结点编号为 i/2 。
11.在一棵二叉树中,第5层上的结点数最多为 16 。
12.假定一棵二叉树的结点数为18,则它的最小深度为 5 ,最大深度为 18 。
13.一棵二叉树的广义表表示为a(b(e,d),e(f(,g))),则e结点的双亲结点为 a ,左孩
/ \
16 37
/ / \
8 30 48
/ \ \
n-1 个用于指向孩子结点, n+1 个指针空闲着。
20.一棵二叉树广义表表示为a(b(d(,h)),c(e,f(g,i(k)))),该树的结点数为 10 个,
深度为 5 。
21.在一棵高度为5的理想平衡树中,最少含有 16 个结点,最多含有 31 个
结点。
22.在一棵高度为h的理想平衡树中,最少全二叉树被顺序存储于一维数组的A[1]~A[n]元素中,试编写一
个算法打印出编号为i的结点的双亲和所有孩子。
解:
void Request(int a[],int n,int i)
//从数组A中打印出编号为i的结点的双亲和孩子
s[top]=p;
p=p->left;
}
if(top!=-1){
p=s[top];
top--;
cout<<p->data<<'';
别为 2 、 1 、 1 和 6 个。
8.假定一棵树的广义表示为A(B(C,D(E,F,G),H(I,J))),则结点H的双亲结点为 B 个,
孩子结点为 I和J 。
9.在一棵二叉树中,假定双亲结点数为5个,单分支结点数为6个,则叶子结点数为 6 个。
10.对于一棵二叉树,若一个结点的编号为i,则它的左孩子结点的编号为 2i ,右孩子
4.画出由三个结点a,b,c组成的所有不同结构的二叉树,共有多少种不同的结构?每一种结
构又对应多少种不同的值的排列次序?
解:
由三个结点a,b,c组成的所有不同结构的二叉树如下图所示,共有5种不同的结构,每一
种结构对应6种不同的值的排列次序。
a a a a a
第五章 树和二叉树二、填空题
1.对于一棵具有n个结点的树,该树中所有结点的度数之和为 n-1 。
2.假定一棵三叉树的结点个数为50,则它的最小深度为 5 ,最大深度为 50 。
3.在一棵高度为h的四叉树中,最多含有 4-1/3 h结点。
4.在地棵三叉树中,度为3的结点数有2个,度为2的结点数有1个,度为1的结点数为2个
p=p->right;
}
}
}
9.编写一算法,求出一棵二叉树中所有结点数和叶子结点,假定分别用变参C1和C2统计所
有结点数和叶子结点数,初值均为0。
解:
void Count(BTreeNode* BT,int& C1,int& C2)
cout<<"no children!"<<end1;
}
6.已知一棵二叉树如下图所示,试分别画出它的不带双亲指针的链接存储结构的示意图和
存储于数组的链接存储映像(假定按层次依次为各结点分配下标位置)。
解:
25
解:
前序遍历为 25,16,8,37,30,28,26,29,32,35,48,60
中序遍历为 8,16,25,26,28,29,30,32,35,37,48,60
后序遍历为 8,16,26,29,28,35,32,30,60,48,37,25
8.写出对二叉树进行中序遍历的非递归算法。
f h i j g d,按层遍历结果为 a b c d e f g h i j。
二、普通题
1.
解:略
2.
解:略
3.已知一棵度为m的树中有n1个度为1的结点,n2个度为2的结点
,.....,nm个度为m的结点,问树中有多少个叶子结点?
解:
设叶子结点数为n0,则树中结点数和总度数分别为
解:
根据从键盘上输入的一棵二叉树广义表表示建立一棵二叉树bt;
把bt二叉树写入到磁盘文件"a:xxkl.dat"中;