先序线索化
计算机专业基础综合数据结构(树和二叉树)历年真题试卷汇编6
计算机专业基础综合数据结构(树和二叉树)历年真题试卷汇编6(总分:88.00,做题时间:90分钟)一、单项选择题(总题数:33,分数:66.00)1.一棵完全二叉树又是一棵( )。
【华中科技大学2006一、7(2分)】A.平衡二叉树B.堆√C.二叉排序树D.哈夫曼(Huffman)树完全二叉树的叶子至多在下面两层上,且一个结点若无左子树,绝不能有右子树。
平衡二叉树任何结点的左右子树的高度差的绝对值不超过1,但其结点的值符合二叉排序树的定义。
平衡二叉树(包括二叉排序树)的树形不一定是完全二叉树。
堆是一个序列,有大堆和小堆,编号为i的结点,其父结点、左右子女结点之间位置的关系,符合完全二叉树父结点、左右子女结点之间的关系,从这点上说,可以把堆看成完全二叉树。
哈夫曼树是二叉树,但树形不一定满足完全二叉树的定义。
2.一棵左子树为空的二叉树在先序线索化后,其中空的链域的个数是( )。
【合肥工业大学1999一、5(2分)】A.不确定B.0C.1D.2 √左子树为空的二叉树的根结点的左线索为空(无前驱),先序序列的最后结点的右线索为空(无后继),共2个空链域。
3.一棵左右子树均不空的二叉树在先序线索化后,其中空的链域的个数是( )。
【合肥工业大学2000一、5(2分)】A.0B.1 √C.2D.不确定4.若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则X的前驱为( )。
【南京理工大学1996一、6(2分)】A.X的双亲B.X的右子树中最左的结点C.X的左子树中最右结点√D.X的左子树中最右叶结点5.引入二叉线索树的目的是( )。
【南京理工大学1998一、5(2分)】A.加快查找结点的前驱或后继的速度√B.为了能在二叉树中方便地进行插入与删除C.为了能方便地找到双亲D.使二叉树的遍历结果唯一6.线素二叉树是一种( )结构。
【西安电子科技大学1996一、9(2分)】A.逻辑B.逻辑和存储C.物理√D.线性7.甩个结点的线索二叉树上含有的线索数为( )。
8哈夫曼树
b d e c
2 3 4 5 6 7 b c d e
d
e f g f g h
f
g
h
8
h
25
3、用孩子兄弟表示法来存储
思路:用二叉链表来表示树,但链表中的两个 指针域含义不同。 左指针指向该结点的第一个孩子; 右指针指向该结点的下一个兄弟结点。
firstchild data nextsibling
100
40
21 32 g e 17 7 a
60
28 11 10 h 6 d 2 c 5 3 f
10
对应的哈夫曼编码(左0右1):
符 编码 频率 符 编码 频率
100
a
b
1100
00
0.07
0.19
a
b
000
001
0.07
0.19 0.06
0 b
0 40
1
1
0 60 1 28 1 0 6 d 0 2 c 11 1d Path Length
树的带权路径长度如何计算? WPL = 哈夫曼树则是:WPL 最小的树。
w kl k
k=1
n
经典之例:
4 d
2 c 7 a (b) 5 b
Huffman树
7 a
7 a
5
2 b c
4 d
5 b
2 c (c)
4 d
(a)
WPL=36
WPL=46
WPL= 35
3
构造霍夫曼树的基本思想: 权值大的结点用短路径,权值小的结点用长路径。 构造Huffman树的步骤(即Huffman算法):
(1) 由给定的 n 个权值{w0, w1, w2, …, wn-1},构造具有 n 棵扩充 二叉树的森林F = { T0, T1, T2, …, Tn-1 },其中每一棵扩充二叉树 Ti 只有一个带有权值 wi 的根结点,其左、右子树均为空。 (2) 重复以下步骤, 直到 F 中仅剩下一棵树为止: ① 在 F 中选取两棵根结点的权值最小的扩充二叉树, 做为左、 右子树构造一棵新的二叉树。置新的二叉树的根结点的权值为 其左、右子树上根结点的权值之和。 ② 在 F 中删去这两棵二叉树。 ③ 把新的二叉树加入 F。
先序线索化转圈问题
先序线索化转圈问题先序线索化转圈问题是一种经典的数学问题,它可以帮助我们探索数学中的先序遍历、线索化和环的概念。
让我们来了解一下先序遍历和线索化的含义。
我们将研究如何将这些概念应用到转圈问题上,并通过一些具体的例子来进一步理解。
1. 先序遍历在二叉树中,先序遍历是指先访问根节点,然后遍历左子树,最后遍历右子树。
这个遍历顺序可以用一个节点序列来表示,我们可以把先序遍历的结果存储在一个数组中。
在这个数组中,根节点的位置总是在左子树和右子树之前。
2. 线索化线索化是将二叉树中的空指针调整为指向前驱节点或后继节点的方式。
通过线索化,我们可以用指针在树中前进而不需要使用递归或栈。
对于一个二叉树的节点,如果它没有左子树,我们可以把它的左指针指向它的前驱节点;如果它没有右子树,我们可以把它的右指针指向它的后继节点。
3. 先序线索化转圈问题现在让我们来考虑一个有趣的问题:如何将一棵已经线索化的二叉树转化为一个环形链表呢?我们需要把每一个节点的右指针指向它的后继节点,并使得最后一个节点的后继节点指向第一个节点。
为了解决这个问题,我们可以使用先序遍历的思想。
我们可以从根节点开始,依次遍历每个节点,并将它的右指针指向它的后继节点。
我们还需要记录前一个访问的节点,以便将它的后继节点指向当前节点。
具体的步骤如下:- 如果当前节点为根节点,将它的右指针指向它的后继节点,并记录当前节点为前一个节点。
- 如果当前节点有左子树,递归处理左子树。
- 如果当前节点有右子树,继续遍历它的右子树。
通过这种方式,我们可以将一个已经线索化的二叉树转化为一个环形链表。
这个环形链表可以让我们在任意节点中,通过右指针循环遍历所有节点。
在实际应用中,先序线索化转圈问题可以用于优化二叉树的遍历算法。
由于线索化的特性,我们可以避免使用递归或栈,从而提高遍历的效率。
通过对先序线索化转圈问题的深入研究,我们可以更好地理解先序遍历、线索化和环的概念。
这个问题不仅提供了一个数学的挑战,还具有一定的实际应用价值。
数据结构(Java版)_郑州大学中国大学mooc课后章节答案期末考试题库2023年
数据结构(Java版)_郑州大学中国大学mooc课后章节答案期末考试题库2023年1.对不含相同元素的同一输入序列进行两组不同的、合法的入栈和出栈组合操作,所得的输出序列一定相同。
参考答案:错误2.在链队列中,即使不设置尾指针,也能进行入队操作。
参考答案:正确3.循环顺序队列和循环链队列都存在空间一处问题。
参考答案:错误4.直接选择排序的时间复杂度与关键字的初始排列无关。
参考答案:正确5.一个循环链表可以由给定的头指针或尾指针来唯一标识。
参考答案:正确6.所谓随机存取,就是通过首地址和元素的序号可以在O(1)的时间内找到指定的元素。
参考答案:正确7.快速排序在最坏情况下的时间复杂度是O(【图片】)。
参考答案:正确8.哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近()参考答案:正确9.在队列中存取数据元素的原则是()。
参考答案:先进先出10.将整数1、2、3、4依次进栈,则不可能得到的出栈序列是()。
参考答案:142311.完全二叉树的存储结构通常采用顺序存储结构()。
参考答案:正确12.在中序线索二叉树中,每一非空的线索均指向其祖先结点()参考答案:正确13.二叉树中序线索化后,不存在空指针域()参考答案:错误14.二叉树的层次遍历需要栈结构的支持。
参考答案:错误15.下列关于AOE网的叙述中,不正确的是()参考答案:任何一个关键活动提前完成,那么整个工程将会提前完成16.一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足()参考答案:只有一个叶子结点17.引入二叉线索树的目的是()参考答案:加快查找结点的前驱或后继的速度18.单源最短路径算法的时间复杂度为()参考答案:O()19.对6个不同的数据元素进行直接插入排序,最多需要进行()次关键字的比较。
参考答案:1520.完全二叉树中,若一个结点没有左孩子,则它必是树叶()。
参考答案:正确21.已知循环队列存储在一维数组A[0【图片】n]中,且队列非空时front和rear分别指向队首元素和队尾元素。
《数据结构》精品课程题库
B.BT[2*i] D.BT[2*i+1]
13. 由同一关键字集合构造的各棵二叉排序树( )
A. 其形态不一定相同,但平均查找长度相同
B. 其形态不一定相同,平均查找长度也不一定相同
C. 其形态均相同,但平均查找长度不一定相同
C.三叉链表 D.顺序存储结构
28. 对一个满二叉树,M个树叶,N个结点,深度为H,则( )
A.N=H+M B.H+M=2H
C.M=H-1 D.N=2*eh-1
29. 如果某二叉树的前序为stuwv,中序为uwtvs,那么该二叉树的后序中( )
A. LL B. LR
C. RL D. RR
6. 一棵含18个结点的二叉树的高度至少为( )
A.3 B.4
C.5 D.6
7. 已知二叉树的先序序列为ABDECF,中序序列为DBEAFC,则后序序列为( )
A.DEBAFC B.DEFBCA
A.只有右子树上的所有结点 B.只有右子树上的部分结点
C.只有左子树上的所有结点 D.只有左子树上的部分结点
25. 树最适合用来表示( )
A.有序数据元素 B.无序数据元素
C.元素之间具有分层次关系的数据 D.元素之间无联系的数据
A.N在M右方 B.N是M祖先
C.N在M左方 D.N是M子孙
32. 线索二叉树是一种__结构( )
A.逻辑 B.逻辑和存储
C.物理 D.线性
33. l 将一棵有 100个结点的完全二叉树,从根这一层开始,每一层从左到右依次对结点编号,根据点的 编号为1,则编号为49的结点的双亲的编号为 ( )
实验8 线索二叉树的创建和遍历
实验八线索二叉树的创建和遍历1.实验目的(1)掌握二叉树的线索链表存储结构。
(2)能够实现二叉树的线索链表的创建、遍历等基本操作。
2.实验内容编程实现二叉树的线索链表存储表示的基本操作,包括线索二叉树的创建与遍历。
3.实验要求(1)根据实验内容编写程序,上机调试并获得运行结果(2)撰写实验报告4.准备工作本次实验将会构造此二叉树,并会对此二叉树进行遍历5.关键步骤与算法(1)构造线索二叉树算法步骤;若某节点的左孩子节点指针域(lchild)为空,就可以利用它来指出该节点在某种遍历序列中的直接前驱的存储地址;若某节点的右孩子指针域(rchild)为空,就可以利用它来指出该节点在某种遍历序列中的直接后继的存储地址。
那些非空的指针域仍存放指向该节点左、右孩子节点的指针域。
这样,就得到了一棵线索二叉树。
算法如下;1.//按先序遍历序列输入树中各节点的值,构造线索二叉树2.BiThrTree* CreateBiThrTree()3.{4. BiThrTree *s;5. DataType ch;6. scanf("%c",&ch);7.8.if(ch == '#')9. exit(0);10.if(ch == '@')11. s = NULL;12.else if (ch=='\n')13. getchar();14.15.else16. {17. s = (BiThrTree *)malloc(sizeof(BiThrTree));18.if(!s)19. exit(ERROR);20. s->data = ch;21. s->lflag = 0;22. s->rflag = 0;23. s->lchild = CreateBiThrTree();24. s->rchild = CreateBiThrTree();25. }26.return s;27.}(2) 将二叉树中序线索化现将树递归到左子树然后再判断这个树的左右子树是否为空,如果为空则把它们的标志设为1,代表线索,首先设一个current代表前驱结点,然后判断它是否为空,如果为空则进行下一次递归,如果不为空,则判断左标志和右标志如果左标志为线索,则让前驱节点的右孩子指向当前节点,如果右标志为1,则让当前节点的左孩子指向前驱结点算法如下;1.void InThreading(BiThrTree *t)2.{3.if(t != NULL)//先判断树为不为空,如果为空,则不执行函数4. {5. InThreading(t->lchild);//递归调用左子树进行线索化6.if(t->lchild == NULL)7. t->lflag = 1;8.if(t->rchild == NULL)9. t->rflag = 1;10.//以上两步是判断这个结点的左右结点是否为空,若为空,把他们对应的flag标上111.if(current != NULL)//因为要用到current所以要判断一下,且current只有当t回到倒数第二个结点时,才会不为NULL12. {13.if(current->rflag == 1)14. current->rchild = t;//前驱结点的右孩子指针指向当前节点t15.if(t->lflag == 1)16. t->lchild = current;//现结点t的左孩子指针指向前驱结点17. }18. current = t;//让前驱结点为t为下一次执行函数做准备19. InThreading(t->rchild);//递归调用右子树进行线索化20. }21.}6.源代码1.#include<malloc.h>2.#include<stdio.h>3.#include<stdlib.h>4.#include<io.h>5.#define ERROR -16.7.typedef char DataType;8.typedef struct BiThrNode//二叉树的二叉链表的存储结构9.{10. DataType data;11.struct BiThrNode *lchild,*rchild;12.int lflag,rflag;//左右标志,值为0表示指针,值为1表示线索13.}BiThrTree;14.BiThrTree *current = NULL;15.//检查if的==16.//按先序遍历序列输入树中各节点的值,构造线索二叉树17.BiThrTree* CreateBiThrTree()18.{19. BiThrTree *s;20. DataType ch;21. scanf("%c",&ch);22.23.if(ch == '#')24. exit(0);25.if(ch == '@')26. s = NULL;27.else if (ch=='\n')28. getchar();29.30.else31. {32. s = (BiThrTree *)malloc(sizeof(BiThrTree));33.if(!s)34. exit(ERROR);35. s->data = ch;36. s->lflag = 0;37. s->rflag = 0;38. s->lchild = CreateBiThrTree();39. s->rchild = CreateBiThrTree();40. }41.return s;42.}43.//将二叉树前序线索化(递归)44.void PreThreading(BiThrTree *t)45.{46.if(t != NULL)//先判断树为不为空,如果为空,则不执行函数47. {48.if(t->lchild == NULL)49. t->lflag = 1;50.if(t->rchild == NULL)51. t->rflag = 1;52.//以上两步是判断这个结点的左右结点是否为空,若为空,把他们对应的flag标上153.if(current != NULL)//因为要用到current所以要判断一下,且current只有当t回到倒数第二个结点时,才会不为NULL54. {55.if(current->rflag == 1)56. current->rchild = t;//前驱结点的右孩子指针指向当前节点t57.if(t->lflag == 1)58. t->lchild = current;//现结点t的左孩子指针指向前驱结点59. }60. current = t;//让前驱结点为t为下一次执行函数做准备61.if(t->lflag == 0)62. PreThreading(t->lchild);//递归调用右子树进行线索化63.if(t->rflag == 0)64. PreThreading(t->rchild);65. }66.}67.//遍历前序线索二叉树68.void PreVisitThrtree(BiThrTree *t)69.{70.while(t != NULL)//大循环71. {72.while(t->lflag == 0)73. {74. printf("%c\t",t->data);75. t = t->lchild;76. }77. printf("%c\t",t->data);78. t = t->rchild;79. }80.}81.82.//检查if的==83.//将二叉树中序线索化(递归)84.void InThreading(BiThrTree *t)85.{86.if(t != NULL)//先判断树为不为空,如果为空,则不执行函数87. {88. InThreading(t->lchild);//递归调用左子树进行线索化89.if(t->lchild == NULL)90. t->lflag = 1;91.if(t->rchild == NULL)92. t->rflag = 1;93.//以上两步是判断这个结点的左右结点是否为空,若为空,把他们对应的flag标上194.if(current != NULL)//因为要用到current所以要判断一下,且current只有当t回到倒数第二个结点时,才会不为NULL95. {96.if(current->rflag == 1)97. current->rchild = t;//前驱结点的右孩子指针指向当前节点t98.if(t->lflag == 1)99. t->lchild = current;//现结点t的左孩子指针指向前驱结点100. }101. current = t;//让前驱结点为t为下一次执行函数做准备102. InThreading(t->rchild);//递归调用右子树进行线索化103. }104.}105.//检查if的==106.//遍历中序线索二叉树107.void InVisitThrtree(BiThrTree *t)108.{109.while(t != NULL)//大循环110. {111.while(t->lflag == 0)//小循环1;此循环第一次进行时首先要去找到最左节点112. t = t->lchild;113.if(t == NULL)114. exit(ERROR);115. printf("%c\t",t->data);116.while(t->rflag == 1 && t->rchild != NULL)//小循环2117. {118. t = t->rchild;119. printf("%c\t",t->data);120. }121. t = t->rchild;122./*123.两种情况:124. 1.如果t的右子树为空则t直接指向t的中序后继结点.125. 2.如果t的右子树不为空,即t->rflag为0,那么退出这个小循环2回到大循环中,再到小循环1中去找t的右子树的最左下的结点.126. */127. }128.}129.130.//将二叉树后序线索化(递归)131.void PostThreading(BiThrTree *t)132.{133.if(t != NULL)//先判断树为不为空,如果为空,则不执行函数134. {135. PreThreading(t->lchild);136. PreThreading(t->rchild);137.if(t->lchild == NULL)138. t->lflag = 1;139.if(t->rchild == NULL)140. t->rflag = 1;141.//以上两步是判断这个结点的左右结点是否为空,若为空,把他们对应的flag标上1142.if(current != NULL)//因为要用到current所以要判断一下,且current只有当t回到倒数第二个结点时,才会不为NULL143. {144.if(current->rflag == 1)145. current->rchild = t;//前驱结点的右孩子指针指向当前节点t146.if(t->lflag == 1)147. t->lchild = current;//现结点t的左孩子指针指向前驱结点148. }149. current = t;//让前驱结点为t为下一次执行函数做准备150. }151.}152.//遍历后序线索二叉树153.void PostVisitThrtree(BiThrTree *t)154.{155.if(t)156. {157.while(t->lchild != NULL && t->lflag == 0)158. {159. t = t->lchild;//先遍历到最左边的节点160. }161. }162.}163.//主函数164.void main()165.{166. BiThrTree *t,*s;167. printf("\t\t请按先序序列输入二叉树(如:ABC@@DE@G@@F@@@#)\n\t\t");168. t = CreateBiThrTree();169. InThreading(t);170. printf("\t\t按中序遍历输出线索二叉树:\n\t\t");171. InVisitThrtree(t);172. printf("\n");173.//getchar();174.//getchar();175. fflush(stdin);//这个操作必须要进行,或者是进行上面注释的那两步操作,要不然176. printf("\t\t请按先序序列输入二叉树(如:ABC@@DE@G@@F@@@#)\n\t\t");177. s = CreateBiThrTree();178. PreThreading(s);179. printf("\t\t按前序遍历输出线索二叉树:\n\t\t");180. PreVisitThrtree(s);181.}7.测试图8.实验总结然对于这一节,主要是讨论线索二叉树的建立以及遍历,对于二叉树的建立,主要有五个部分构成,分别是data,lchild,rchild,lflag,rflag,而它与二叉树不同的地方就是多了lflag和rflag的判断,当当前节点的左节点为空时一定会指向它的前驱结点,当前驱节点的右节点为空时,让前驱结点的右指针域指向当前节点,这就是线索化,而对于前序中序后序的线索化本质都是一样的。
《数据结构》模拟试卷八
模拟试卷八一、选择题(每小题2分,共10分)1.一个栈的输入序列为12345,则下列序列中不可能是栈的输出序列的是。
(l)12345 (2)54321(3)23451 (4)412352.一棵左子树为空的二叉树在先序线索化后,其中的空链域的个数为。
(1)0 (2)1(3)2 (4)不确定3.在用邻接表表示图的情况下,拓扑排序算法的时间复杂度为。
(l) O(n+e)(2) O(n2)(3) O(n×e)(4) O(n3)4.下列排序算法中,在每一趟都能选出一个元素放到其最终位置上,并且其时间性能受数据初始特性影响的是。
(1)直接插入排序(2)快速排序(3)直接选择排序(4)堆排序5.下列排序算法中,依次将待排序序列中的元素和前面有序序列合并为一个新的有序序列的排序算法是。
(1)直接插入排序(2)冒泡排序(3)快速排序(4)直接选择排序二、判断题(每小题1分,共10分)l.()设指针 P指向单链表中一个结点,则语句序列U:=P^.next; U :=U^.next 将删除一个结点。
2.()栈和队列都是运算受限的线性表。
3.()广义表的长度是指广义表中的原子个数。
4.()若某二叉树的叶子结点数为1,则其先序序列和后序序列一定相反。
5.()二叉树在按任一种次序线索化后,都可以很容易地求出相应次序下的前趋和后继。
6.()在采用线性探测法处理冲突的散列表中,所有同义词在表中相邻。
7.()对B树中任一非叶子结点中的某关键字K,比K小的最大关键字和比K大的最小关键字一定都在叶子结点中。
8.()若一个无向图的以顶点1为起点的深度遍历序列唯一,则可唯一确定该图。
9.()在对一有向无环图执行拓扑排序算法之后,入度数组中的所有元素的值为0。
10.()在数据表基本有序时,冒泡排序算法的时间复杂度一定接近O(n)。
三、填空题(每小题2分,共20分)1.在单链表中,在指针P所指结点的后面插入一个结点到的语句序列是。
数据结构_2_试题卷
山东工商学院2020学年第一学期数据结构课程试题 A卷(考试时间:120分钟,满分100分)特别提醒:1、所有答案均须填写在960数字加起来827参考答案207上,写在试题纸上无效。
2、每份答卷上均须准确填写函授站、专业、年级、学号、姓名、课程名称。
一单选题 (共20题,总分值40分 )1. 以下属单链表优点的是()。
(2 分)A. 顺序存取B. 插入操作能在O(1)的时间复杂度上完成C. 插入时不需移动数据元素D. 节省存储空间2. 外部排序是指()。
(2 分)A. 在外存上进行的排序方法B. 不需要使用内存的排序方法C. 数据量很大,需要人工干预的排序方法D. 排序前后数据在外存,排序时数据调入内存的排序方法3. 若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。
(2 分)A. 顺序表B. 双链表C. 带头结点的双向循环链表D. 单循环链表4. 下列不属算法特性的是()。
(2 分)A. 有穷性B. 确定性C. 零或多个输入D. 健壮性5. 设有一组关键字值(46,79,56,38,40,84),则用快速排序的方法,以第一个记录为基准得到的一次划分结果为()。
(2 分)A. 38,40,46,56,79,84B. 40,38,46,79,56,84C. 40,38,46,56,79,84D. 40,38,46,84,56,796. ISAM文件和VSAM文件属于()。
(2 分)A. 索引非顺序文件B. 索引顺序文件C. 顺序文件D. 散列文件7. 直接插入排序在最好情况下的时间复杂度为()。
(2 分)A. O(logn)B. O(n)C. O(n*logn)D. O(n2)8. 判定一个栈顶指针为S且不带头结点的链栈为空栈的条件是()。
(2 分)A. SB. S->nextC. S->next==NULLD. !S9. 在树形结构中,数据元素间存在()的关系。
Examples
#include <stdio.h> typedef int MaxIx[100]; Main() {
MaxIx Array; int Count = 0, d = 0, i, m, n; do {
printf(“请输入n和m:”);scanf(“%d, %d”, &n, &m); } while (n <= m); for (i = 0; i < n; i++) Array[i] = i + 1; while (d < n)
Queue
编写向顺序分配的环形队列QU[0,m0-1]中 插入一个结点的函数。
void CQEnqueue(Cqueue &qu, int x) {
if ((qu->rear + 1) % m0 == qu->front) Error(“Overflow”);
else { qu->rear = (qu->rear + 1) % m0; qu->q[qu->rear] = x;
基数排序。 因为这里英文单词的长度相等,且英文单词 是由26个字母组成的,满足进行基数排序的 条件,另外,依题意,M<<N,基数排序的 时间复杂性由O(M(N+RM))变成O(N),因 此时间复杂性最佳。
设计一个函数修改起泡排序过程以实现 双向起泡排序。
void Dbubble(SqList &La) {
} return (tag); } }
采用顺序结构存储串,编写一个实现串通
配符匹配的函数pattern_index(),其中的通 配符只有‘?’,它可以和任一字符匹配成
功,
ch6习题及答案
习题6解答判断题:1.二叉树中每个结点有两个子女结点,而对一般的树则无此限制,因此二叉树是树的特殊情形。
( ╳ )2.二叉树就是结点度为2的树。
( ╳ )( (哈工大2000年研究生试题)3.二叉树中不存在度大于2的结点,当某个结点只有一棵子树时无所谓左、右子树之分。
( ╳ ) (陕西省1998年自考试题)4.当k≥1时,高度为k的二叉树至多有21 k个结点。
( ╳ )5.完全二叉树的某结点若无左孩子,则它必是叶结点。
(√)(中科院软件所1997年研究生试题)6.用一维数组存放二叉树时,总是以前序遍历顺序存储结点。
( ╳ )7.若有一个结点是某二叉树子树的中序遍历序列中的最后一个结点,则它必是该子树的前序遍历序列中的最后一个结点。
( ╳ )8.存在这样的二叉树,对它采用任何次序的遍历,结果相同。
(√)(哈工大2000年研究生试题)9.中序线索二叉树的优点之一是便于在中序下查找前驱结点和后继结点。
(√)10.将一棵树转换成二叉树后,根结点没有左子树,( ╳ )(北邮1999年研究生试题。
)11.由树转换成二叉树,其根结点的右子树总是空的。
(√)12.前序遍历森林和前序遍历与该森林对应的二叉树其结果不同。
( ╳ )13.在叶子数目和权值相同的所有二叉树中,最优二叉树一定是完全二叉树。
( ╳ )14.在哈夫曼编码中,当两个字符出现的频率相同时,其编码也相同,对于这种情况应作特殊处理。
( ╳ )15.霍夫曼树一定是满二叉树。
( ╳ )16.树的度是树内各结点的度之和。
( ╳ )17.由二叉树的结点构成的集合可以是空集合。
(√)18.一棵树中的叶子结点数一定等于与其对应的二叉树中的叶子结点数。
( ╳ )选择题:19.树最适合用来表示( C )。
A.有序数据元素 B. 无序数据元素C.元素之间具有分支层次关系的数据 D. 元素之间无联系的数据20.如果结点A有3个兄弟,而且B是A的双亲,则B的度是( D )。
离散数学树知识点总结
第六章树一、掌握根本概念树的子树是互不相交的,树可以为空〔空树〕非空的树中,只有一个结点是没有前趋的,那就是根。
非空树只有一个树根,是一对多的关系。
叶子结点、结点的度、树的度、结点的层次、树的深度、树的四种表示方法二、二叉树的定义、特点、五种根本形态二叉树是有序树,左右子树不能互相颠倒二叉树中结点的最大度为2,但不一定都是2。
三、二叉树的性质要掌握性质1:二叉树的第i层上至多有2 i-1〔i 1〕个结点。
性质2:深度为k的二叉树中至多2k-1个结点。
性质3:对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,那么n0=n2+1。
证明:1)结点总数n=n0+n1+n2 (n1是度为1的结点数)2)进入分支总数m(每个结点唯一分支进入) n=m+13)m个分支是由非叶子结点射出m=n1+2n2性质4:具有n个结点的完全二叉树的深度k为[log2n]+1四、满二叉树和完全二叉树的区别是什么?满二叉树一定是完全二叉树,但是完全二叉树不一定是满二叉树。
深度为k的二叉树,最少有k个结点,最多有2k-1深度为k的完全二叉树,最少有2k-1-1+1个结点,最多有2k-1五、二叉树的存储构造〔可以通过下标找结点的左右孩子〕1.顺序存储构造适用于满二叉树和完全二叉树。
〔其缺点是必须把其他二叉树补成完全二叉树,从上到下,从左到右依次存储在顺序存储空间里,会造成空间浪费〕2.二叉链表存储构造〔其优点是找左孩子和右孩子方便,但缺点是找父节点麻烦〕lchild Data rchild〔重点〕3. 三叉链表存储构造不仅找其左、右孩子很方便,而且找其双亲也方便六、遍历的概念是什么?七、二叉树的遍历有三种:前序〔先序、先根〕遍历、中序〔中序、中根〕遍历、后序〔后序、后根〕遍历1.给出一棵二叉树,要会二叉树的三种遍历2.给出两种遍历〔必须有中序遍历〕,要求会画该二叉树。
八、了解引入线索〔中序、先序、后序〕二叉树的原因是什么?九、会在二叉树上画先序线索化、中序线索化、后序线索化。
线索二叉树
6·4 线索二叉树1、线索二叉树的结点结构二叉树的遍历本质上是将一个复杂的非线性结构转换为线性结构,使每个结点都有了唯一前驱和后继(第一个结点无前驱,最后一个结点无后继)。
对于二叉树的一个结点,查找其左右子女是方便的,其前驱后继只有在遍历中得到。
为了容易找到前驱和后继,有两种方法。
一是在结点结构中增加向前和向后的指针fwd和bkd,这种方法增加了存储开销,不可取;二是利用二叉树的空链指针。
现将二叉树的结点结构重新定义如下:其中:ltag=0 时ltag=1 时lchild指向前驱;rtag=0 时rchild指向左子女;rtag=1 时rchild指向后继;以这种结点结构构成的二叉链表作为二叉树的存储结构,叫做线索链表,指向前驱和后继的指针叫线索,加上线索的二叉树叫线索二叉树,对二叉树进行某种形式遍历使其变为线索二叉树的过程叫线索化。
学习线索化时,有三点必须注意:一是何种“序”的线索化,是先序、中序还是后序;二是要“前驱”线索化、“后继”线索化还是“全”线索化(前驱后继都要);三是只有空指针处才能加线索。
2、对二叉树进行中序线索化的算法bithptr *pre; /* 全程变量*/void INTHREAD(bithptr *p){if(p!=NULL){ INTHREAD(p->lchild); /* 左子树线索化*/if(p->lchild==NULL) { p->ltag=1;p->lchild=pre;}if(p->rchild==NULL) p->rtag=1;if(pre!=NULL && pre->rtag==1) pre->rchild=p;pre=p; /* 前驱指向当前结点*/INTHREAD(p->rchild); /* 右子树线索化*/}3、在线索二叉树上查找前驱和后继(1)中序线索二叉树:若结点的ltag=1,lchild指向其前驱;否则,该结点的前驱是以该结点为根的左子树上按中序遍历的最后一个结点。
数据结构清华大学模拟试题一答案
清华大学模拟题一一.单项选择题(2分/题)1.一个栈的输入序列为12345,则下列序列中是栈的输出序列的是()。
知道这题的解题思路吗?A.23415B.54132C.31245D.142532.设循环队列中数组的下标范围是1~n,其头尾指针分别为f和r,则其元素个数为()。
A.r-fB.r-f+1C.(r-f) mod n +1D.(r-f+n) mod n3.二叉树在线索化后,仍不能有效求解的问题是()。
这题是线索化问题,可能你没看过。
可以等我去给你讲。
A.先序线索二叉树中求先序后继B. 中序线索二叉树中求中序后继C.中序线索二叉树中求中序前驱D. 后序线索二叉树中求后序后继4.求最短路径的FLOYD算法的时间复杂度为()。
(那Djstla的时间复杂度呢?)A.O(n)B.O(n+e)C.O(n2)D.O(n3)5.一棵左右子树不空的二叉树在先序线索化后,其空指针域数为()。
(知道是哪个指针域吗?就是最后一个访问的节点的右指针,因为它没有后继节点。
)A.0B.1C.2D.不确定6.数组A[1..5,1..6]的每个元素占5个单元,将其按行优先顺序存储在起始地址为1000的连续的内存单元中,则元素A[5,5]的地址为()。
这题可要会哟@A.1140B.1145C.1120D.11257.在下列排序算法中,在待排序的数据表已经为有序时,花费时间反而最多的是()。
(要知道为什么,这个我跟你讲过)A.快速排序B.希尔排序C.冒泡排序D.堆排序8.对有18个元素的有序表做折半查找,则查找A[3]的比较序列的下标依次为()。
(这题的数组下标应该说明一下是A[1..18])A.1-2-3B.9-5-2-3C.9-5-3D. 9-4-2-39.下列排序算法中,某一趟结束后未必能选出一个元素放在其最终位置上的是()。
这些题出的都不错!A.堆排序B.冒泡排序C.快速排序D.直接插入排序10.在平衡二叉树中插入一个结点后造成了不平衡,设最低的不平衡点为A,并已知A的左孩子的平衡因子为-1,右孩子的平衡因子为0,则做()型调整以使其平衡。
数据结构期末考试试题和标准答案及评分标准
数据结构期末考试试题和标准答案及评分标准《数据结构》试题(A卷)(考试时间: 90分钟)一、单项选择题(本大题共15小题,每小题2分,共30分)(每题只有一个选项是正确的,将答案填写在括号内,错选、多选不得分)1.()是组成数据的基本单位,是一个数据整体中相对独立的单元。
A.数据 B.数据元素 C.数据对象 D.数据结构2.算法计算量的大小称为算法的()。
A.效率B.复杂度C.数据元素之间的关系??? ?D.数据的存储方法3.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入或删除运算,则采用以下()方式最节省时间。
A.链式存储B. 索引存储C.顺序存储D.散列存储4.下述哪一条是顺序存储结构的优点?()A.存储密度大?B.插入运算方便?C.删除运算方便?D.可方便地用于各种逻辑结构的存储表示5.在一个单链表中,若删除p所指结点的后续结点,则执行()。
>next=p->next->next >next=p->next=p->next;p->next=p->next->next =p->next->next6.带头结点的单链表head为空的判定条件是()。
==NULL >next==NULL >next==head !==NULL7.非空的循环单链表head的尾结点(由p所指向)满足()。
>head==NULL ==NULL >next==head ==head8.下面关于线性表的叙述中,错误的是哪一个?()A.线性表采用顺序存储,必须占用一片连续的存储单元。
B.线性表采用顺序存储,便于进行插入和删除操作。
C.线性表采用链式存储,不必占用一片连续的存储单元。
D.线性表采用链式存储,便于插入和删除操作。
9.队列操作的原则是()。
A.后进先出B.先进先出C.只能进行插入D.只能进行删除10.栈中允许进行插入和删除的一端称为()。
数据结构试题库
数据结构试题库一、单项选择题1. 下列程序段所代表的算法的时间复杂度为( D )。
x=n;y=0;while (x>=(y+1)*(y+1))y++;(A) O(n) (B)O(n 2) (C)O(log 2n) (D)O( n )2. 在一个长度为n 的以顺序结构存储的线性表中,假设在线性表的任何位置删除元素的概率相等,则删除一个元素时线性表所需移动元素的平均次数为( B )。
(A) n2 (B)(n-1)/2 (C)(n+1)/2 (D)n/23. 在一个栈顶指针为HS 的链栈中插入一个*s 结点时,应执行执行操作为( C )。
(A) HS->next=s; (B)s->next=HS->next;HS->next=s;(C)s->next=HS;HS=s; (D)s->next=HS;HS=HS>next;4. 假设以带头结点的循环链表表示队列Q,并且队列只设一个头指针front ,不设队列尾指针。
若要进队一个元素*s ,则在下列程序算法的空白处应添加的操作语句是( A )。
void AddQueue(struct linkqueue Q){ p=Q->front;while(p->next!=Q->front) p=p->next;}(A)p->next=s;s->next=Q->front;(B)Q->front->next=s;Q->front=s;(C)s->next=p;p->next=Q->front;(D)Q->front->next=s;s->next=p;5. 设高度为h 的二叉树上只有度为0 和度为 2 的结点,则此类二叉树中所包含的结点数至少为( B )。
(A)2 h-1 (B)2 h-1 +1 (C)2 h-1 (D)2 h-1 -36.现有数据集{53,30,37,12,45,24,96} ,从空二叉树逐个插入数据形成二叉排序树,v5v4 ^v1 v2v5 ^v2 ^v3v3 v6 ^ v6 ^ v3 ^v4 ^v5 v4v6^若希望查找此二叉树中任一结点的平均查找长度最小,则应选择下面哪个序列输入( C )。
兄弟树阅读答案
兄弟树阅读答案【篇一:第六章树习题答案】t>一、选择题1、已知一算术表达式的中缀形式为 a+b*c-d/e,后缀形式为abc*+de/-,其前缀形式为(d )a.-a+b*c/de b. -a+b*cd/ec.-+*abc/de d. -+a*bc/de2、算术表达式a+b*(c+d/e)转为后缀表达式后为( b )a.ab+cde/* b.abcde/+*+c.abcde/*++ d.abcde*/++3.设树t的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1 则t中的叶子数为( d)a.5b.6 c.7 d.84.在下述结论中,正确的是( d)①只有一个结点的二叉树的度为0; ②二叉树的度为2;③二叉树的左右子树可任意交换;④深度为k的完全二叉树的结点个数小于或等于深度相同的满二叉树。
a.①②③ b.②③④c.②④ d.①④5.设森林f对应的二叉树为b,它有m个结点,b的根为p,p的右子树结点个数为n,森林f中第一棵树的结点个数是( a )a.m-nb.m-n-1 c.n+1d.条件不足,无法确定6.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是( b )a.9b.11c.15 d.不确定7.在一棵三元树中度为3的结点数为2个,度为2的结点数为1个,度为1的结点数为2个,则度为0的结点数为( c )个a.4 b.5 c.6d.78.设森林f中有三棵树,第一,第二,第三棵树的结点个数分别为m1,m2和m3。
与森林f对应的二叉树根结点的右子树上的结点个数是( d )。
【北方交通大学 2001 一、16 (2分)】a.m1 b.m1+m2 c.m3 d.m2+m39.具有10个叶结点的二叉树中有( b)个度为2的结点,a.8 b.9 c.10 d.ll10.一棵完全二叉树上有1001个结点,其中叶子结点的个数是(e ) a. 250b. 500 c.254 d.505e.以上答案都不对11.设给定权值总数有n 个,其哈夫曼树的结点总数为( d)a.不确定 b.2nc.2n+1d.2n-112.有关二叉树下列说法正确的是( b)a.二叉树的度为2 b.一棵二叉树的度可以小于2c.二叉树中至少有一个结点的度为2d.二叉树中任何一个结点的度都为213.二叉树的第i层上最多含有结点数为( c )a.2i b. 2i-1-1 c. 2i-1d.2i -114.一个具有1025个结点的二叉树的高h为( c )a.11 b.10 c.11至1025之间d.10至1024之间15.一棵二叉树高度为h,所有结点的度或为0,或为2,则这棵二叉树最少有( b )结点a.2h b.2h -1 c.2h+1d.h+118.对于有n 个结点的二叉树, 其高度为(d )a.nlog2nb.log2n c.?log2n?|+1 d.不确定19. 一棵具有 n个结点的完全二叉树的树高度(深度)是( a)a.?logn?+1 b.logn+1 c.?logn?d.logn-120.深度为h的满m叉树的第k层有( a)个结点。
考研资料数据结构试题库
考研资料数据结构试题库Test 1⼀、单项选择题(每题2分,共30分)1.若某线性表中最常⽤的操作是取第i个元素和找第i个元素的前趋元素,则采⽤()存储⽅式最节省时间。
A) 单链表 B) 双链表 C) 单向循环链表 D) 顺序表2.串是任意有限个()。
A) 符号构成的序列 B) 符号构成的集合C) 字符构成的序列 D) 字符构成的集合3.设矩阵A的任⼀元素aij(1≤i,j≤10)满⾜:aij≠0;(i≥j,1≤i,j≤10)aij=0;(i现将A的所有⾮0元素以⾏序为主序存放在⾸地址为2000的存储区域中,每个元素占有4个单元,则元素A[9,5]的⾸地址为()。
A) 2340 B) 2336 C)2164 D) 21604.如果以链表作为栈的存储结果,则出栈操作时()。
A) 必须判别栈是否为满 B) 对栈不作任何判别C) 必须判别栈是否为空 D) 判别栈元素的类型5.设数组Data[0..m]作为循环队列SQ的存储空间,front为队头指针,rear为队尾指针,则执⾏出队操作的语句为()。
A) front = front+1 B) front =(front+1) % mC) rear = (rear+1) % m D) front = (front+1) % (m+1)6.深度为6(根的层次为1)的⼆叉树⾄多有()结点。
A) 64 B) 32 C)31 D) 637.将含100个结点的完全⼆叉树从根这⼀层开始,每层上从左到右依次堆结点编号,根结点的编号为1。
编号为49的结点X的双亲的编号为()。
A) 24 B) 25 C)23 D) ⽆法确定8.设有⼀个⽆向图和,如果为的⽣成树,则下⾯不正确的说法是()。
A) 为的⼦图 B) 为的连通分量C) 为的极⼩连通⼦图且 D) 为的⼀个⽆环⼦图9.⽤线性探测法查找闭散列表,可能要探测多个散列地址,这些位置上的键值()。
A) ⼀定都是同义词B) ⼀定都不是同义词C) 多相同D) 不⼀定都是同义词10.⼆分查找要求被查找的表是()。
树和二叉树-第6章-《数据结构题集》习题解析-严蔚敏吴伟民版
树和⼆叉树-第6章-《数据结构题集》习题解析-严蔚敏吴伟民版习题集解析部分第6章树和⼆叉树——《数据结构题集》-严蔚敏.吴伟民版源码使⽤说明链接☛☛☛课本源码合辑链接☛☛☛习题集全解析链接☛☛☛相关测试数据下载链接☛本习题⽂档的存放⽬录:数据结构\▼配套习题解析\▼06 树和⼆叉树⽂档中源码的存放⽬录:数据结构\▼配套习题解析\▼06 树和⼆叉树\▼习题测试⽂档-06源码测试数据存放⽬录:数据结构\▼配套习题解析\▼06 树和⼆叉树\▼习题测试⽂档-06\Data⼀、基础知识题6.1❶已知⼀棵树的集合为{<I, M>, <I, N>, <E, I>, <B, E>, <B, D>, <A, B>, <G, J>, <G, K>, <C, G>, <C, F>, <H, L>, <C, H>, <A, C>},请画出这棵树,并回答下列问题:(1)哪个是根结点?(2)哪些是叶⼦节点?(3)哪个是结点G的双亲?(4)哪些是结点G的祖先?(5)哪些是结点G的孩⼦?(6)哪些是结点E的⼦孙?(7)哪些是结点E的兄弟?哪些是结点F的兄弟?(8)结点B和N的层次号分别是什么?(9)树的深度是多少?(10)以结点C为根的⼦树的深度是多少?6.2❶⼀棵度为2的树与⼀棵⼆叉树有何区别?6.3❶试分别画出具有3个结点的树和3个结点的⼆叉树的所有不同形态。
6.4❸⼀棵深度为H的满k叉树有如下性质:第H层上的结点都是叶⼦结点,其余各层上每个结点都有k棵⾮空⼦树。
如果按层次顺序从1开始对全部结点编号,问:(1)各层的结点数⽬是多少?(2)编号为p的结点的⽗结点(若存在)的编号是多少?(3)编号为p的结点的第i个⼉⼦结点(若存在)的编号是多少?(4)编号为p的结点有右兄弟的条件是什么?其右兄弟的编号是多少?6.5❷已知⼀棵深度为k的树中有n1个度为1的结点,n2个度为2的结点,…,nk个度为k的结点,问该树中有多少个叶⼦结点?6.6❸已知在⼀棵含有n个结点的树中,只有度为k的分⽀结点和度为0的叶⼦结点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南通大学数据结构实践课实验报告册姓名:耿智班级:软件工程092学号:0913063042实验名称:先序线索化指导老师:丁卫平南通大学杏林学院2011年6月16日1.程序设计简介本实验程序用于验证二叉树的先序线索化及先序线索二叉树先序遍历算法,为了查看线索结果,增加了线索显示功能。
设计时综合考虑到中序线索化需求,采用设计一个基类,然后在此基础上生成所需的对象。
2.源程序#include "Base.cpp"template <class T>class CPreThreading:public CThr<T>{bool IsThreaded;public:CPreThreading(){IsThreaded=false;}void Pre_ThreadBiTree(); //生成先序线索二叉树void Pre_Thread(BiThrNode<T>*p,BiThrNode<T>**h); //先序线索void Pre_TraThrBiTree(); //遍历先序线索二叉树void ShowPreTree(); //显示线索化后的信息};template <class T>void CPreThreading<T>::Pre_ThreadBiTree(){ //生成先序线索二叉链表BiThrNode<T>*bt,*q=NULL;bt=BT; //根结点Pre_Thread(bt,&q);}//--------------------------------------------------------------------------------template <class T>void CPreThreading<T>::Pre_TraThrBiTree(){if(IsThreaded==false){cout<<"请先线索化!"<<endl;return;}cout<<"\n--------------------------------------------------"<<endl;cout<<"遍历先序线索二叉树得:";BiThrNode<T>*p;if(BT==NULL) return ; //二叉链表为空cout<<BT->data<<' '; //输出根结点的值p=BT->lchild; //沿左子树if(p==NULL) p=BT->rchild; //左子树为空则沿右子树while(p!=NULL){cout<<p->data<<' '; //输出当前结点的值while(p->lflag==0) //沿左链访问直到左标志非0{p=p->lchild;cout<<p->data<<' ';}p=p->rchild;}cout<<"\n--------------------------------------------------"<<endl;}//--------------------------------------------------------------------------------template <class T>void CPreThreading<T>::Pre_Thread(BiThrNode<T>*bt,BiThrNode<T>**h) {BiThrNode<T>*p,*q; //定义两个结点指针变量if(bt!=NULL) //bt指向的结点不空{p=bt->lchild ;q=bt->rchild ;//若当前访问的结点的左指针为空,则将上次访问的结点赋给左指针域,并置标志域if((*h!=NULL)&&(p==NULL)){bt->lchild= *h;bt->lflag= 1;}//若上次访问的结点的右指针为空//则将访问过的结点指针赋给当前结点的右指针域,并置标志域为1if((*h!=NULL)&&((*h)->rchild==NULL)){(*h)->rchild=bt;(*h)->rflag=1;}*h=bt; //记下当前访问的结点Pre_Thread(p,h); //访问左子树Pre_Thread(q,h); //访问右子树}IsThreaded=true;}//--------------------------------------------------------------------------------template <class T>void CPreThreading<T>::ShowPreTree(){if(IsThreaded==false){cout<<"请先线索化!"<<endl;return;}cout<<"\n--------------------------------------------------"<<endl;cout<<"下面显示的是先序线索化以后的结果:"<<endl;BiThrNode<T>*p;if(BT==NULL) return ; //二叉链表为空。
if(BT->lflag==1) //如果标志域为1,输出它的前驱。
cout<<"值为:"<<BT->data<<"结点的前驱是:"<<BT->lchild->data<<endl;if(BT->rflag==1) //如果标志域为1,输出它的后继。
cout<<"值为:"<<BT->data<<"结点的后继是:"<<BT->rchild->data<<endl;p=BT->lchild; //沿左子树。
if(p==NULL) p=BT->rchild; //左子树为空则沿右子树。
while(p!=NULL){if(p->lflag==1) //如果标志域为1,输出它的前驱。
cout<<"值为:"<<p->data<<"结点的前驱是:"<<p->lchild->data<<endl;if(p->rflag==1) //如果标志域为1,输出它的后继。
cout<<"值为:"<<p->data<<"结点的后继是:"<<p->rchild->data<<endl;while(p->lflag==0) //沿左链访问直到左标志非0{p=p->lchild;if(p->lflag==1) //如果标志域为1,输出它的前驱。
cout<<"值为:"<<p->data<<"结点的前驱是:"<<p->lchild->data<<endl;if(p->rflag==1) //如果标志域为1,输出它的后继。
cout<<"值为:"<<p->data<<"结点的后继是:"<<p->rchild->data<<endl;}p=p->rchild;}cout<<"--------------------------------------------------"<<endl;}//--------------------------------------------------------------------------------void main(){int opr;//操作变量CPreThreading<int> Tr;//创建一个int 模板类型的对象do{system("cls");cout<<"----------菜单---------------"<<endl;cout<<"--* 1:创建二叉树*--"<<endl;cout<<"--* 2:先序线索化二叉树*--"<<endl;cout<<"--* 3:先序线索化二叉树先序遍历*--"<<endl;cout<<"--* 4:显示先序线索信息*--"<<endl;cout<<"--* 5:退出操作*--"<<endl;cout<<"--------------------------------"<<endl;cout<<"请选择操作[ ]";cout<<"\b\b";cin>>opr;switch(opr){case 1:if(Tr.GetRoot()) Tr.DeleteNode(); //释放之前创建的对象的所有结点空间Tr.CreateBiTree(-1); //创建二叉树system("pause");break;case 2:Tr.Pre_ThreadBiTree(); //先序线索化二叉树cout<<"线索化完成!"<<endl;system("pause");break;case 3:Tr.Pre_TraThrBiTree(); //先序遍历二叉树system("pause");break;case 4:Tr.ShowPreTree(); //显示线索化之后的标志域信息system("pause");break;case 5:cout<<"结束运行,Bye-Bye!"<<endl;break;default:cout<<"选择不合理,请重选!"<<endl;break;}}while(opr!=5);}3.程序运行4.调试感想在线索化二叉树时,如果像书上把二叉树和线索二叉树的存储结构分开,则二叉树中的数据域不能传递到线索二叉树中(两个类型的指针不能互相赋值)。