数据结构——线索二叉树实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
线索二叉树应用实验
实验报告
实验目的
(1)掌握线索二叉树的有关知识。
(2)掌握求解线索二叉树中结点前趋和后继的算法以及以相应次序遍历线索二叉树的算法。
(3)掌握二叉树的线索化算法的设计。
实验运行环境
Visual C++
实验任务
线索二叉树是为了快速求解二叉树中结点在指定次序下的前驱和后继,而将二叉链表中空的左右孩子指针分别改为指向其前驱和后继结点而得到的结构,反映了运算对数据结构的设计的影响。因此,首先要了解线索二叉树的结构特点,其中原本为空的指针被修改为前驱和后继指针,使得对左右子树和线索的判断发生了变化。利用线索可以实现某些次序下的前驱和后继。本实验期望能理解线索二叉树的结构特点,实现各前驱和后接算法的求解,并掌握将二叉树转换为线索二叉树的算法,即线索化算法。为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"btrechar.h"中的函数的形式给出,并假设该库函数中定义了线索二叉树的相关功能,如显示线索二叉树等。
实验内容
第一题:
按先序次序遍历先序线索二叉树。
实验测试数据基本要求:
第一组数据: full41.cbt
第二组数据: letter.cbt
实验准备:
1:将二叉树的根结点的指针传给函数。
2:判断当前结点是否为先序遍历的最后一个结点,若是则访问完该结点后结束,否则进入3。
2:判断当前结点是否有左子树,若有的话访问完该结点后访问它的左子树,否则访问它的右子树,返回2。
第二题:
按中序次序遍历中序线索二叉树。
实验测试数据基本要求:
第一组数据: full41.cbt
第二组数据: letter.cbt
实验准备:
1:将二叉树的根结点的指针传给函数。
2:判断当前结点是否为中序遍历的最后一个结点,若是则访问完该结点后结束,否则进入3。
3:对于当前结点,先访问该结点的前驱结点并进入第二步,其次访问该结点并进入第二步最后访问该结点的后继结点并进入2。
第三题:
将值为x的结点作为先序线索二叉树T的左子树的(先序)最后一个结点的右孩子插入进去。
实验测试数据基本要求:
第一组数据: full41.cbt
第二组数据: letter.cbt
实验准备:
1:将先序线索二叉树的根结点的指针传给函数。
2:判断当前结点是否为要找的结点P,若是则建立一个新的结点,将新结点作为P的右孩子,并根据新建的结点修改前驱后继关系,否则进入3。
3:指针指向该结点先序遍历的后继,返回2。
第四题:
按中序次序线索化二叉树。
实验测试数据基本要求:
第一组数据: full41.cbt
第二组数据: letter.cbt
实验准备:
1:设立两个指针pre与t分别代表前驱结点与当前结点。
2:按照中序访问的顺序,对于访问到的每一个结点进行如下的操作。
3:判断当前结点是否为空,若是则结束,否则进入第四步。
4:对于当前结点如果它的左孩子为空,则将该结点前驱线索化,
如果它的前驱指针pre指向的结点的右孩子为空,则将pre指向的结点后继线索化,
如果对于当前结点如果它的右孩子为空,则将该结点的rchild置为1,将t 赋值给pre。
5:将t指向它在中序中的后继,返回到3。
第五题:
按后序次序线索化二叉树。
实验测试数据基本要求:
第一组数据: full41.cbt
第二组数据: letter.cbt
实验准备:
1:设立两个指针pre与t分别代表前驱结点与当前结点。
2:按照后序访问的顺序,对于访问到的每一个结点进行如下的操作。
3:判断当前结点是否为空,若是则结束,否则进入4。
4:对于当前结点如果它的左孩子为空,则将该结点前驱线索化,
如果它的前驱指针pre指向的结点的右孩子为空,则将pre指向的结点后继线索化,
如果对于当前结点如果它的右孩子为空,则将该结点的rchild置为1,将t 赋值给pre。
5:将t指向它在后序中的后继,返回到3。
实验测试数据
实验程序
#include
using namespace std;
int m;
struct tbnode
{
char data;
tbnode *lchild,*rchild;
int ltag,rtag;
};
tbnode *pre=NULL; //初始化前驱指针
class tbtree{
public:
tbtree();
int height(tbnode *p);
void prepare_tree(tbnode *&p); //初始化二叉树
void first_tree(tbnode *p); //先序线索化
void second_tree(tbnode *p); //中序线索化
void third_tree(tbnode *p); //后序线索化
void first_first_tree(tbnode *p); //先序编历先序线索化二叉树
void second_second_tree(tbnode *p); //中序编历中序线索化二叉树tbnode *&get_root(){ return root;}
tbnode *prepare(tbnode *p)
{
if(p->ltag==0) return p->lchild;