二叉树实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五二叉树
一、目的和要求
1. 掌握二叉树的逻辑结构定义和各种存储结构的实现。
2. 熟练运用二叉树的各种存储结构以及各种基本操作。
3. 根据实际问题的需要,选择二叉树适合的存储结构解决问题。
二、实验环境
1.WindowsXP操作系统;
2.DEV C++、Visual C++6.0语言环境;
三、实验内容
(一)验证性实验(每个同学完成,每个小题一个文件夹,所有文件夹打在一个包中,文件名:“学号”+“姓名”,例如: 14121000张三.rar 。提交码为2015DS1,截止时间:2016年2月22日8:00时。)
1.二叉链表的验证
(1)在二叉链表类模板中增加函数成员CountLeaf (),统计二叉树中叶子结点的数目。
(2)在二叉链表类模板中增加函数成员Revolute(),实现二叉树中所有结点的左右子树交换。
(3)在二叉链表类模板中增加函数成员CountBreadth (),统计二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。
(4)在二叉链表类模板中,增加函数成员NonRecurringInOrder(),实现非递归中序遍历二叉树。
2.线索二叉树的验证
(1)在中序线索二叉树类模板中增加函数成员ReInOrder(),通过从中序序列最后一个结点开始依次找当前结点的前驱来逆中序遍历二叉树。
(2)在中序线索二叉树类模板中增加函数成员InsertLeftChild(p,e),实现在中序线索二叉树指定结点p上插入左孩子结点e。
(3)在中序线索二叉树类模板中增加函数成员PostOrder(),实现不用栈后序遍历二叉树。
3.堆的验证
(1)对最小堆进行测试验证,要求把测试过程截屏保存下来。
(2)修改最小堆中构造函数MinHeap(ElemType a[],int maxSize,int n),从空堆开始依次插入数组a中的元素构造堆。
(3)把最小堆的类模板改造成最大堆。
(二)设计性实验(小组完成)
4.二叉树的顺序存储
参考二叉树的二叉链表类模板,设计并实现二叉树的顺序存储表示。增加函数成员,求离两个元素(编号为i和j)最近的共同祖先。
5.二叉树的三叉链表表示
参考二叉树的二叉链表类模板,设计并实现二叉树的三叉链表表示。增加函数成员,实现非递归先序、后序遍历二叉树。
6.后序线索二叉树的实现
参考中序线索二叉树的类模板,设计并实现后序线索二叉树。增加函数成员,利用线索求指定结点p在后序序列中的后继结点。
7.前序线索二叉树的实现
参考中序线索二叉树的类模板,设计并实现前序线索二叉树。增加函数成员,利用线索求指定结点p在先序序列中的后继结点。
(三)综合性实验(小组完成)
8.标记二叉树
【问题描述】
一棵二叉树,根节点标记为(1,1),规定:如果一个结点标记为(a,b),则它的左孩子(如果存在)标记为(a+b,b),它的右孩子(如果存在)标记为(a,a+b)。现在已知某个结点的标记为(a,b),求从根节点开始需要经过多少次左分支和多少次右分支才能到达结点(a,b)。
【输入文件】
输入文件第一行只有一个整数n,表示测试的数据组数。
接下来n行(第2-n+1行),每行包括二个整数a和b。
【输出文件】
输出文件有n行,每行包括二个整数,分别表示从根节点开始达结点(a,b)需要进过的左分支数和右分支数。
【样例输入】
2
42 1
3 4
【样例输出】
41 1
2 1
9.表达式二叉树
[问题描述]
表达式可以用一棵二叉树表示,叶子结点代表操作数,分支结点代表操作符。对于表示简单四则运算表达式(操作数只有变量和常量,没有数组元素和函数)的表达式二叉树,要求实现以下功能。
(1)输入表达式,生成其二叉树表示。
(2)对于一棵构造好的表达式二叉树,输出相应的中缀表达式(不允许有冗余的括号)。所谓冗余的括号就是去掉括号后不影响表达式的计算顺序。例如,“(c+b)+a”中的括号是冗余的,它可以表示成不冗余的“c+b+a”形式。例如,图1所示的表达式二叉树,对应的中缀表达式为:a-(b-c)/(e*(f+g))。
(3)对于一棵构造好的表达式二叉树,输出相应的后缀表达式。例如,表达式“a-(b-c)/(e*(f+g))”的后缀表达式为:abc-efg+*/-。
(4
(5)输出表达式二叉树的树形结构。
【输入与输出】
提供一个菜单,方便选择不同的功能。根据选择的功能输出相应的结果。
10.家谱管理系统
[问题描述]
家谱管理系统是查询家谱信息必不可少的一部分,利用家谱管理系统可以清楚的查询到家族成员的详细信息。成员的信息一般应包含以下内容:姓名、出生日期、婚姻状况(已婚、未婚等)、地址、目前状况(健在或身故)、死亡日期(若其已死亡)等,也可附加其它信息。系统要求设计合理的数据结构存储家谱中各成员的信息(一般定义结构体)和成员之间的关系(用二叉树表示)。要求系统可以插入、查询、修改、删除等功能。
[系统功能]
1.从文件输入信息,建立初始家谱树。
2.用恰当的形式显示家谱树。
3.根据代号n,显示第n 代所有人的姓名和人数。
4.按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息,以及他在家谱中的代数)。
5.按照出生日期查询成员名单。
6.输入两人姓名,确定其关系。
7.给某人添加孩子。
8.删除某人(若其还有后代,则一并删除)。
9.修改某人信息。
[实验提示]
对于成员之间的关系可以用二叉树表示。在这棵二叉树中,每一个结点的左孩子结点表示其第一个孩子信息,右孩子结点表示其下一个兄弟信息。例如,如图2所示的家谱树,其对于的二叉树结构如图3所示。