数据结构习题第六章 树和二叉树答案
严蔚敏《数据结构习题集》答案第六章树和二叉树文库
第六章树和二叉树
int Is_Descendant_C(int u,int v)
int Bitree_Sim(Bitree B1,Bitree B2)次根据栈顶元素的mark域值决定做何种动作.
typedef struct {
int data;
EBTNode *lchild;
EBTNode *rchild;
EBTNode *parent;
enum {0,1,2} mark;
} EBTNode,EBitree;
typedef struct {
int data;
PBTNode *lchild;
PBTNode *rchild;
PBTNode *parent;
} PBTNode,PBitree; .
scanf("%d",&k);
c=0; .
}
void LayerOrder(Bitree T)相比,作了一个修改,不管当前结点是否有左右孩子,都入队列.这样当树为完全二叉树时,遍历时得到是一个连续的不包含空指针的序列.反之,则序列中会含有空指针.
Status CreateBitree_Triplet(Bitree &T)意:为了能用一个统一的公式计算子孙数目,所以当T为空指针时,要返回-1而不是0.
BTNode *PreOrder_Next(BTNode *p)不是哪儿理解错了
Bitree PostOrder_Next(Bitree p)irstchild) return 1;
for(sd=1,p=[T].firstchild;p;p=p->next)
if((d=SubDepth(p->child))>sd) sd=d;
数据结构树和二叉树习题及答案
习题六树和二叉树
一、单项选择题
1.以下说法错误的是()
A.树形结构的特点是一个结点可以有多个直接前趋
B.线性结构中的一个结点至多只有一个直接后继
C.树形结构可以表达(组织)更复杂的数据
D.树(及一切树形结构)是一种”分支层次”结构
E.任何只含一个结点的集合是一棵树
2.下列说法中正确的是()
A.任何一棵二叉树中至少有一个结点的度为 2
B.任何一棵二叉树中每个结点的度都为 2
C.任何一棵二叉树中的度肯定等于 2
D.任何一棵二叉树中的度可以小于 2
3.讨论树、森林和二叉树的关系,目的是为了(
)
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+M3
7.一棵完全二叉树上有1001个结点,其中叶子结点的个数是()
A.250 B .500 C .254 D .505 E .以上答案都不对
8.设给定权值总数有n 个,其哈夫曼树的结点总数为()
A.不确定 B . 2n C . 2n+1 D . 2n-1
数据结构第六章树和二叉树习题及答案
习题六树和二叉树
一、单项选择题
1.以下说法错误的是()
A. 树形结构的特点是一个结点可以有多个直接前趋
B. 线性结构中的一个结点至多只有一个直接后继
C. 树形结构可以表达(组织)更复杂的数据
D. 树(及一切树形结构)是一种”分支层次”结构
E. 任何只含一个结点的集合是一棵树
2. 下列说法中正确的是()
A. 任何一棵二叉树中至少有一个结点的度为2
B. 任何一棵二叉树中每个结点的度都为2
C. 任何一棵二叉树中的度肯定等于2
D. 任何一棵二叉树中的度可以小于2
3. 讨论树、森林和二叉树的关系,目的是为了()
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+M3
7.一棵完全二叉树上有1001个结点,其中叶子结点的个数是()
A.250 B .500 C .254 D .505 E .以上答案都不对
8. 设给定权值总数有n 个,其哈夫曼树的结点总数为()
A. 不确定 B . 2n C . 2n+1 D . 2n-1
数据结构课后习题及解析第六章
第六章习题
1.试分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。2.对题1所得各种形态的二叉树,分别写出前序、中序和后序遍历的序列。
3.已知一棵度为k的树中有n
1个度为1的结点,n
2
个度为2的结点,……,n
k
个度为k的结点,
则该树中有多少个叶子结点并证明之。
4.假设一棵二叉树的先序序列为EBADCFHGIKJ,中序序列为ABCDEFGHIJK,请画出该二叉树。
5.已知二叉树有50个叶子结点,则该二叉树的总结点数至少应有多少个?
6.给出满足下列条件的所有二叉树:
①前序和后序相同
②中序和后序相同
③前序和后序相同
7. n个结点的K叉树,若用具有k个child域的等长链结点存储树的一个结点,则空的Child 域有多少个?
8.画出与下列已知序列对应的树T:
树的先根次序访问序列为GFKDAIEBCHJ;
树的后根次序访问序列为DIAEKFCJHBG。
9.假设用于通讯的电文仅由8个字母组成,字母在电文中出现的频率分别为:
0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10
请为这8个字母设计哈夫曼编码。
10.已知二叉树采用二叉链表存放,要求返回二叉树T的后序序列中的第一个结点指针,是否可不用递归且不用栈来完成?请简述原因.
11. 画出和下列树对应的二叉树:
12.已知二叉树按照二叉链表方式存储,编写算法,计算二叉树中叶子结点的数目。
13.编写递归算法:对于二叉树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间。
14.分别写函数完成:在先序线索二叉树T中,查找给定结点*p在先序序列中的后继。在后序线索二叉树T中,查找给定结点*p在后序序列中的前驱。
数据结构课后习题(第6章)
【课后习题】第6章树和二叉树
网络工程2010级()班学号:姓名:
一、填空题(每空1分,共16分)
1.从逻辑结构看,树是典型的。
2.设一棵完全二叉树具有999个结点,则此完全二叉树有个叶子结点,有
个度为2的结点,有个度为1的结点。
3.由n个权值构成的哈夫曼树共有个结点。
4.在线索化二叉树中,T所指结点没有左子树的充要条件是。
5.在非空树上,_____没有直接前趋。
6.深度为k的二叉树最多有结点,最少有个结点。
7.若按层次顺序将一棵有n个结点的完全二叉树的所有结点从1到n编号,那么当i为
且小于n时,结点i的右兄弟是结点,否则结点i没有右兄弟。
8.N个结点的二叉树采用二叉链表存放,共有空链域个数为。
9.一棵深度为7的满二叉树有___ ___个非终端结点。
10.将一棵树转换为二叉树表示后,该二叉树的根结点没有。
11.采用二叉树来表示树时,树的先根次序遍历结果与其对应的二叉树的遍历结
果是一样的。
12.一棵Huffman树是带权路径长度最短的二叉树,权值的外结点离根较远。
二、判断题(如果正确,在对应位置打“√”,否则打“⨯”。每题0.5分,共5分)
1.对于一棵非空二叉树,它的根结点作为第一层,则它的第i层上最多能有2i-1个结点。
2.二叉树的前序遍历并不能唯一确定这棵树,但是,如果我们还知道该二叉树的根结点
是那一个,则可以确定这棵二叉树。
3.一棵树中的叶子结点数一定等于与其对应的二叉树中的叶子结点数。
4.度≤2的树就是二叉树。
5.一棵Huffman树是带权路径长度最短的二叉树,权值较大的外结点离根较远。
数据结构习题与答案--树和二叉树
第六章树和二叉树
一、判断题
( t )01、若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n—1个非空指针域。
( f )02、二叉树中每个结点的两棵子树的高度差等于1。
(t )03、二叉树中每个结点的两棵子树是有序的。
( f )04、二叉树中每个结点有两棵非空子树或有两棵空子树。( f )05、二叉树中所有结点个数是2k-1-1,其中k是树的深度。
(f )06、二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。
( f )07、对于一棵非空二叉树,它的根结点作为第一层,则它的第i层上最多能有2i—1个结点。
(t )08、用二叉链表法存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。
(t)09、具有12个结点的完全二叉树有5个度为2的结点。( f )10、二叉树中每个结点的关键字值大于其左非空子树(若存在的话)所有结点的关键字值,且小于其右非空子树(若存在的话)所有结点的关键字值。
( f )11、二叉树按某种顺序线索化后,任一结点均有指向其前驱和后续的线索。
( t )12、二叉树的先序遍历序列中,任意一个结点均处在其孩子结点的前面。
二、填空题
01、由3个结点所构成的二叉树有_5_种形态。
02、一棵深度为6的满二叉树有____个分支结点和____个叶子。
03、一棵具有257个结点的完全二叉树,它的深度为____。
04、设一棵完全二叉树有700个结点,则共有____个叶子结点。
05、设一棵完全二叉树具有1000个结点,则此完全二叉树有____个叶子结点,有____个度为2的结点,有____个结点只有非空左子树,有____个结点只有非空右子树。
第6章_数据结构习题题目及答案_树和二叉树_参考答案
一、基础知识题
6.1设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1,求树T中的叶子数。
【解答】设度为m的树中度为0,1,2,…,m的结点数分别为n0, n1, n2,…, nm,结点总数为n,分枝数为B,则下面二式成立
n= n0+n1+n2+…+nm (1)
n=B+1= n1+2n2 +…+mnm+1 (2)
由(1)和(2)得叶子结点数n0=1+
即: n0=1+(1-1)*4+(2-1)*2+(3-1)*1+(4-1)*1=8
6.2一棵完全二叉树上有1001个结点,求叶子结点的个数。
【解答】因为在任意二叉树中度为2 的结点数n2和叶子结点数n0有如下关系:n2=n0-1,所以设二叉树的结点数为n, 度为1的结点数为n1,则
n= n0+ n1+ n2
n=2n0+n1-1
1002=2n0+n1
由于在完全二叉树中,度为1的结点数n1至多为1,叶子数n0是整数。本题中度为1的结点数n1只能是0,故叶子结点的个数n0为501.
注:解本题时要使用以上公式,不要先判断完全二叉树高10,前9层是满二叉树,第10层都是叶子,……。虽然解法也对,但步骤多且复杂,极易出错。
6.3 一棵124个叶结点的完全二叉树,最多有多少个结点。
【解答】由公式n=2n0+n1-1,当n1为1时,结点数达到最多248个。
6.4.一棵完全二叉树有500个结点,请问该完全二叉树有多少个叶子结点?有多少个度为1的结点?有多少个度为2的结点?如果完全二叉树有501个结点,结果如何?请写出推导过程。
【解答】由公式n=2n0+n1-1,带入具体数得,500=2n0+n1-1,叶子数是整数,度为1的结点数只能为1,故叶子数为250,度为2的结点数是249。
数据结构与算法第六章课后答案第六章 树和二叉树
第6章 树和二叉树(参考答案)
6.1
(1)根结点a
6.2
三个结点的树的形态: 三个结点的二叉树的形态:
(1) (1) (2) (4) (5)
6.3 设树的结点数是n ,则
n=n0+n1+n2+……+nm+ (1)
设树的分支数为B ,有
n=B+1
n=1n1+2n2+……+mnm+1 (2)
由(1)和(2)有:
n0=n2+2n3+……+(m-1)nm+1
6.4
(1) k i-1 (i 为层数)
(2) (n-2)/k+1
(3) (n-1)*k+i+1
(4) (n-1)%k !=0; 其右兄弟的编号 n+1
6.5(1)顺序存储结构
注:#为空结点
6.6
(1) 前序 ABDGCEFH
(2) 中序 DGBAECHF
(3) 后序 GDBEHFCA
6.7
(1) 空二叉树或任何结点均无左子树的非空二叉树
(2) 空二叉树或任何结点均无右子树的非空二叉树
(3) 空二叉树或只有根结点的二叉树
6.8
int height(bitree bt)
// bt是以二叉链表为存储结构的二叉树,本算法求二叉树bt的高度
{ int bl,br; // 局部变量,分别表示二叉树左、右子树的高度
if (bt==null) return(0);
else { bl=height(bt->lchild);
br=height(bt->rchild);
return(bl>br? bl+1: br+1); // 左右子树高度的大者加1(根) }
}// 算法结束
6.9
void preorder(cbt[],int n,int i);
数据结构树和二叉树习题及答案
习题六树和二叉树
一、单项选择题
1.以下说法错误的是 ( )
A.树形结构的特点是一个结点可以有多个直接前趋
B.线性结构中的一个结点至多只有一个直接后继
C.树形结构可以表达(组织)更复杂的数据
D.树(及一切树形结构)是一种"分支层次"结构
E.任何只含一个结点的集合是一棵树
2.下列说法中正确的是 ( )
A.任何一棵二叉树中至少有一个结点的度为2
B.任何一棵二叉树中每个结点的度都为2
C.任何一棵二叉树中的度肯定等于2
D.任何一棵二叉树中的度可以小于2
3.讨论树、森林和二叉树的关系,目的是为了()
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+M3
7.一棵完全二叉树上有1001个结点,其中叶子结点的个数是()
A. 250 B. 500 C.254 D.505 E.以上答案都不对
8. 设给定权值总数有n 个,其哈夫曼树的结点总数为( )
A.不确定 B.2n C.2n+1 D.2n-1
《数据结构题集》答案 第6章 树和二叉树
第六章树和二叉树
6.33
int Is_Descendant_C(int u,int v)//在孩子存储结构上判断u是否v的子孙,是则返回1,否则返回0
{
if(u==v) return 1;
else
{
if(L[v])
if (Is_Descendant(u,L[v])) return 1;
if(R[v])
if (Is_Descendant(u,R[v])) return 1; //这是个递归算法
}
return 0;
}//Is_Descendant_C
6.34
int Is_Descendant_P(int u,int v)//在双亲存储结构上判断u是否v的子孙,是则返回1,否则返回0
{
for(p=u;p!=v&&p;p=T[p]);
if(p==v) return 1;
else return 0;
}//Is_Descendant_P
6.35
这一题根本不需要写什么算法,见书后注释:两个整数的值是相等的.
6.36
int Bitree_Sim(Bitree B1,Bitree B2)//判断两棵树是否相似的递归算法
{
if(!B1&&!B2) return 1;
else
if(B1&&B2&&Bitree_Sim(B1->lchild,B2->lchild)&&Bitree_Sim(B1->rchild,B2->rc hild))
return 1;
else return 0;
}//Bitree_Sim
6.37
void PreOrder_Nonrecursive(Bitree T)//先序遍历二叉树的非递归算法{
第6章_数据结构习题题目及答案_树和二叉树_参考答案
一、基础知识题
6.1设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1,求树T中的叶子数。
【解答】设度为m的树中度为0,1,2,…,m的结点数分别为n0, n1, n2,…, nm,结点总数为n,分枝数为B,则下面二式成立
n= n0+n1+n2+…+nm (1)
n=B+1= n1+2n2 +…+mnm+1 (2)
由(1)和(2)得叶子结点数n0=1+
即: n0=1+(1-1)*4+(2-1)*2+(3-1)*1+(4-1)*1=8
6.2一棵完全二叉树上有1001个结点,求叶子结点的个数。
【解答】因为在任意二叉树中度为2 的结点数n2和叶子结点数n0有如下关系:n2=n0-1,所以设二叉树的结点数为n, 度为1的结点数为n1,则
n= n0+ n1+ n2
n=2n0+n1-1
1002=2n0+n1
由于在完全二叉树中,度为1的结点数n1至多为1,叶子数n0是整数。本题中度为1的结点数n1只能是0,故叶子结点的个数n0为501.
注:解本题时要使用以上公式,不要先判断完全二叉树高10,前9层是满二叉树,第10层都是叶子,……。虽然解法也对,但步骤多且复杂,极易出错。
6.3 一棵124个叶结点的完全二叉树,最多有多少个结点。
【解答】由公式n=2n0+n1-1,当n1为1时,结点数达到最多248个。
6.4.一棵完全二叉树有500个结点,请问该完全二叉树有多少个叶子结点?有多少个度为1的结点?有多少个度为2的结点?如果完全二叉树有501个结点,结果如何?请写出推导过程。
【解答】由公式n=2n0+n1-1,带入具体数得,500=2n0+n1-1,叶子数是整数,度为1的结点数只能为1,故叶子数为250,度为2的结点数是249。
数据结构第6章 树习题+答案
第六章 树和二叉树
一、选择题
1.已知一算术表达式的中缀形式为 A+B*C-D/E ,后缀形式为ABC*+DE/-,其前缀形式为( D )
A .-A+B*C/DE B. -A+B*CD/E C .2. 设有一表示算术表达式的二叉树(见下图), 它所表示的算术表达式是( C ) 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-G 3. 在下述结论中,正确的是( D )
①只有一个结点的二叉树的度为0; ②二叉树的度为2; ③二叉树的左右
子树可任意交换;
④深度为K 的完全二叉树的结点个数小于或等于深度相同的满二叉树。
A .①②③
B .②③④
C .②④
D .①④
4. 设森林F 对应的二叉树为B ,它有m 个结点,B 的根为p,p 的右子树结点个数为n,森林F 中第一棵树的结点个数是( A )
A .m-n
B .m-n-1
C .n+1
D .条件不足,无法确定
5.设森林F 中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。与森林F 对应的二叉树根结点的右子树上的结点个数是( D )。
A .M1
B .M1+M2
C .M3
D .M2+M3
6. 设给定权值总数有n 个,其哈夫曼树的结点总数为( D )
A .不确定
B .2n
C .2n+1
D .2n-1
7.一棵二叉树高度为h,所有结点的度或为0,或为2,则这棵二叉树最少有( B )结点
A .2h
B .2h-1
C .2h+1
D .h+1
数据结构第六章树和二叉树习题及答案
习题六树和二叉树
一、单项选择题
1.以下说法错误的是 ( )
A.树形结构的特点是一个结点可以有多个直接前趋
B.线性结构中的一个结点至多只有一个直接后继
C.树形结构可以表达(组织)更复杂的数据
D.树(及一切树形结构)是一种"分支层次"结构
E.任何只含一个结点的集合是一棵树
2.下列说法中正确的是 ( )
A
B
C
D
3
A
B
C
D
4
A
C
5)A.
6F对应
A.
7
A.
8.
A
9
A.2
10
A.
11. 利用二叉链表存储树,则根结点的右指针是()。
A.指向最左孩子 B.指向最右孩子 C.空 D.非空
12.已知一棵二叉树的前序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历的结果为()。
A.CBEFDA B. FEDCBA C. CBEDFA D.不定
13.已知某二叉树的后序遍历序列是dabec, 中序遍历序列是debac , 它的前序遍历是()。
A.acbed B.decab C.deabc D.cedba
14.在二叉树结点的先序序列,中序序列和后序序列中,所有叶子结点的先后顺序()A.都不相同 B.完全相同
C.先序和中序相同,而与后序不同 D.中序和后序相同,而与先序不同
15.在完全二叉树中,若一个结点是叶结点,则它没()。
A.左子结点 B.右子结点
C.左子结点和右子结点 D.左子结点,右子结点和兄弟结点
16.在下列情况中,可称为二叉树的是()
A.每个结点至多有两棵子树的树
B. 哈夫曼树
C.每个结点至多有两棵子树的有序树
D. 每个结点只有一棵右子树
E.以上答案都不对
17. 一棵左右子树均不空的二叉树在先序线索化后,其中空的链域的个数是:( )。
数据结构树和二叉树习题及答案
习题六树和二叉树
一、单项选择题
1.以下说法错误的是()
A.树形结构的特点是一个结点可以有多个直接前趋
B.线性结构中的一个结点至多只有一个直接后继
C.树形结构可以表达(组织)更复杂的数据
D.树(及一切树形结构)是一种”分支层次”结构
E.任何只含一个结点的集合是一棵树
2.下列说法中正确的是()
A.任何一棵二叉树中至少有一个结点的度为 2
B.任何一棵二叉树中每个结点的度都为 2
C.任何一棵二叉树中的度肯定等于 2
D.任何一棵二叉树中的度可以小于 2
3.讨论树、森林和二叉树的关系,目的是为了(
)
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+M3
7.一棵完全二叉树上有1001个结点,其中叶子结点的个数是()
A.250 B .500 C .254 D .505 E .以上答案都不对
8.设给定权值总数有n 个,其哈夫曼树的结点总数为()
A.不确定 B . 2n C . 2n+1 D . 2n-1
数据结构第06章 树和二叉树习题
第六章树和二叉树
一、选择题
1、用顺序存储的方法,将完全二叉树中所有结点按层逐个从左到右的顺序存放在一维数组R[1..n]中,若结点R[i]有左孩子,则其左孩子是()。
A. R[2i-1]
B. R[2i+1]
C. R[2i]
D. R[2/i]
2、用顺序存储的方法,将完全二叉树中所有结点按层逐个从左到右的顺序存放在一维数组R[1..n]中,若结点R[i]有右孩子,则其右孩子是()。
A. R[2i-1]
B. R[2i+1]
C. R[2i]
D. R[2/i]
3、设a,b为一棵二叉树上的两个结点,在中序遍历时,a在b前面的条件是()。
A. a在b的右方
B. a在b的左方
C. a是b的祖先
D. a是b的子孙
4、设一棵二叉树的中序遍历序列:badce,后序遍历序列:bdeca,则二叉树先序遍历序列为()。
A. adbce
B. decab
C. debac
D. abcde
5、对某二叉树进行先序遍历的结果为ABDEFC,中序遍历的结果为DBFEAC,则后序遍历的结果是()。
A. DBFEAC
B. DFEBCA
C. BDFECA
D. BDEFAC
6、树最适合用来表示()。
A. 有序数据元素
B. 无序数据元素
C. 元素之间具有分支层次关系的数据
D. 元素之间无联系的数据
7、在线索二叉树中,t所指结点没有左子树的充要条件是()。
A. t->left==NULL
B. t->ltag==1
C. t->ltag==1&&t->left==NULL
D. 以上都不对
8、任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序()。
数据结构第六章 树和二叉树课后习题答案
第六章课后习题
6、1、各层的结点数目是:K
2、编号为n的结点的双亲结点是:<=(n-2)/k的最大整数
3、编号为n的结点的第i个孩子结点编号是:k*(n-1)+1+i
4、编号为n的结点有右兄弟的条件是:(n-1)能被k整除
右兄弟的编号是:n+1.
7、1、先序序列和中序序列相同:空二叉树或没有左子树的二叉树。
2、中序序列和后序序列相同:空二叉树或没有右子树的二叉树。
3、先序序列和后序序列相同:空二叉树或只有根的二叉树。
9、中序序列:BDCEAFHG和后序序列:DECBHGFA的二叉树为:
A
B F
C G
D E H
先序序列:ABCDEFGH
算法设计:
3、typedef struct
{
int data[100];
int top;
}seqstack;
seqstack *s;
Perorder(char a[],int n)
{
int i=1,count=1;
s->top=-1;
if(n==0)return(0);
else
{
if(I<=n)
{
s->top++;
s->data[s->top]=a[I];
}
while(count<n)
{
printf(“%c”,s->data[s->top]);
count++;
s->top--;
if(s->data[s->top]);==a[i])
{ printf(“%c”,s->data[s->top]);
count++;
s->top--;
}
if((2*i+1)<n)
{
i=2*i;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章树和二叉树
注:参考答案只能作为参考,也是有错的,自己要学会辨别。
一、单项选择题
1.A
2.D
3.A
4.C
5.B
6.D
7.E
8. D
9.C
10.B
11. C
12.A
13.D
14.B
15.C
16.B
17.D
18.B
19. D
20.C
二、判断题(在各题后填写“√”或“×”)
1. 完全二叉树一定存在度为1的结点。×
2. 对于有N个结点的二叉树,其高度为log2n。×
3. 二叉树的遍历只是为了在应用中找到一种线性次序。√
4. 一棵一般树的结点的前序遍历和后序遍历分别与它相应二叉树的结点前序遍历和后序遍历是一致的。×
5. 用一维数组存储二叉树时,总是以前序遍历顺序存储结点。×
6.中序遍历一棵二叉排序树的结点就可得到排好序的结点序列√
7.完全二叉树中,若一个结点没有左孩子,则它必是树叶。√
8. 二叉树只能用二叉链表表示。×
9. 给定一棵树,可以找到唯一的一棵二叉树与之对应。√
10. 用链表(llink-rlink)存储包含n个结点的二叉树,结点的2n个指针区域中有n-1个空指针。×
11.树形结构中元素之间存在一个对多个的关系。√
12.将一棵树转成二叉树,根结点没有左子树。×
13.度为二的树就是二叉树。×
14.二叉树中序线索化后,不存在空指针域。×
15.霍夫曼树的结点个数不能是偶数。√
16.哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近。√
三、填空题
1.p->lchild==null && p->rchlid==null
2.(1)2k-1 (2)2k-1
3.64
4. 2n n-1 n+1
5.先序遍历后序遍历中序遍历
6..(1)2k-2+1(第k层1个结点,总结点个数是2H-1,其双亲是2H-1/2=2k-2)(2) ⎣log2i⎦+1 7.4
8.任何结点至多只有右子女的二叉树。
9.前序
10.69
11. count++, countleaf(l->rchild,count)
12.(1) p=p->lchild // 沿左子树向下(2)p=p->rchild
13.(1)0 (2)hl>hr (3)hr=hl
14.(1)p->rchild (2)p->lchild (3)p->lchild
(4)ADDQ(Q,p->lchild) (5)ADDQ(Q,p->rchild)
四、应用题
1.树和二叉树逻辑上都是树形结构,树和二叉树的区别有三:一是二叉树的度至多为2,树无此限制;二是二叉树有左右子树之分,即使在只有一个分枝的情况下,也必须指出是左子树还是右子树,树无此限制;三是二叉树允许为空,树一般不允许为空(个别书上允许为空)。二叉树不是树的特例。
2.【解答】
具有3个结点的树具有3个结点的二叉树
3.解答:先根序列:A B C D E F G H I J;
中根序列:BCDAFEHJIG;
后根序列:D C B F J I H G E A。
4.(1)k h-1(h为层数)
(2)因为该树每层上均有K h-1个结点,从根开始编号为1,则结点i的从右向左数第2个孩子的结点编号为ki。设n 为结点i的子女,则关系式(i-1)k+2<=n<=ik+1成立,因i是整数,故结点n的双亲i的编号为⎣n-2)/k⎦+1。
(3) 结点n(n>1)的前一结点编号为n-1(其最右边子女编号是(n-1)*k+1),故结点 n的第 i个孩子的编号是(n-1)*k+1+i。
(4) 根据以上分析,结点n有右兄弟的条件是,它不是双亲的从右数的第一子女,即(n-1)%k!=0,其右兄弟编号是n+1。
5.
6.(l )图略;
(2) 前序序列:ABCEDFHGI
J 中序序列: E C B H F D J I G A
后序序列: ECHFJIGDBA
(3)图略。
7.字符A ,B ,C ,D 出现的次数为9,1,5,3。其哈夫曼编码如下A:1,B:000,C:01,D:001
五、算法设计题
1.[题目分析]二叉树是递归定义的,以递归方式建立最简单。判定是否是完全二叉树,可以使用队列,在遍历中利用完全二叉树“若某结点无左子女就不应有右子女”的原则进行判断。
BiTree Creat() //建立二叉树的二叉链表形式的存储结构
{ElemType x ;BiTree bt;
scanf(“%d”,&x); //本题假定结点数据域为整型
if (x==0) bt=null;
elseif (x>0)
{bt=(BiNode *)malloc(sizeof (BiNode));
bt->data=x; bt->lchild=creat(); bt->rchild=creat();
}
else error(“输入错误”);
return (bt);
}//结束 BiTree
H G D
A C J I
B F E M P O N
KO L
int JudgeComplete(BiTree bt) //判断二叉树是否是完全二叉树,如是,返回1,否则,返回0
{int tag=0; BiTree p=bt, Q[]; // Q是队列,元素是二叉树结点指针,容量足够大
if(p==null) return (1);
QueueInit(Q); QueueIn(Q,p); //初始化队列,根结点指针入队
while (!QueueEmpty(Q))
{p=QueueOut(Q); //出队
if (p->lchild && !tag) QueueIn(Q,p->lchild); //左子女入队
else {if (p->lchild) return 0; //前边已有结点为空,本结点不空
else tag=1; //首次出现结点为空
if (p->rchild && !tag) QueueIn(Q,p->rchild); //右子女入队
elseif (p->rchild) return 0; else tag=1;
} //while
return 1; } //JudgeComplete
[算法讨论]完全二叉树证明还有其它方法。判断时易犯的错误是证明其左子树和右子数都是完全二叉树,由此推出整棵二叉树必是完全二叉树的错误结论。
2.[题目分析]后序遍历最后访问根结点,即在递归算法中,根是压在栈底的。采用后序非递归算法,栈中存放二叉树结点的指针,当访问到某结点时,栈中所有元素均为该结点的祖先。本题要找p和q 的最近共同祖先结点r ,不失一般性,设p在q的左边。后序遍历必然先遍历到结点p,栈中元素均为p的祖先。将栈拷入另一辅助栈中。再继续遍历到结点q时,将栈中元素从栈顶开始逐个到辅助栈中去匹配,第一个匹配(即相等)的元素就是结点p 和q 的最近公共祖先。
typedefstruct
{BiTree t;int tag;//tag=0 表示结点的左子女已被访问,tag=1表示结点的右子女已被访问
}stack;
stack s[],s1[];//栈,容量够大
BiTree Ancestor(BiTree ROOT,p,q,r)//求二叉树上结点p和q的最近的共同祖先结点r。{top=0; bt=ROOT;
while(bt!=null ||top>0)
{while(bt!=null && bt!=p && bt!=q) //结点入栈
{s[++top].t=bt; s[top].tag=0; bt=bt->lchild;} //沿左分枝向下
if(bt==p) //不失一般性,假定p在q的左侧,遇结点p时,栈中元素均为p的祖先结点
{for(i=1;i<=top;i++) s1[i]=s[i]; top1=top; }//将栈s的元素转入辅助栈s1 保存
if(bt==q) //找到q 结点。
for(i=top;i>0;i--)//;将栈中元素的树结点到s1去匹配
{pp=s[i].t;
for (j=top1;j>0;j--)
if(s1[j].t==pp) {printf(“p 和q的最近共同的祖先已找到”);return(pp);}