一、实验目的和要求
目的:设计并实现基于后序线索二叉树的后序遍历的非递归算法。
要求:
(1)创建二叉树。
(2)转换为后序线索二叉树。
(3)实现后序遍历的非递归算法。
(4)其它要求同课后作业-01要求。
二、实验环境
软件环境:visual stdio 2017
硬件环境:①CPU:Intel(R)Core(TM)i7-8565U CPU @1.80Ghz
②内存:8.0GB
三、实验内容
设计并实现基于后序线索二叉树的后序遍历的非递归算法。
四、实验过程
4.1 任务定义和问题分析
本次实验主要解决的任务可以分解为:建立一颗二叉树,将二叉树进行后序线索化,对线索化后的二叉树进行后序遍历。
4.2 数据结构的选择和概要设计
数据结构采取链式结构建立树,每个结点增加部分辅助空间以服务于二叉树的线索化。
通过编写后序线索化函数将树中叶子结点空闲的左儿子指针和右儿子指针指向逻辑上的前驱后继。
4.3 详细设计
每个二叉树结点新增1个指针,2个bool型标记。指针为父亲指针,指向结点的父亲。两个bool型标记表示该节点的左/右儿子指针是否指向逻辑上的前驱后继还是子节点。
template<typename T>
struct BTNode
{
T data;
bool ltag;
bool rtag;
BTNode<T>* leftson;
BTNode<T>* rightson;
BTNode<T>* father;
};
将二叉树封装为类:
template<typename T>
class BT
{
public:
BT();
~BT();
void build(); //建树
void erase(); //删除
void ToPoClueBT(); //转换为后序线索二叉树
void PoTraversal(); //后序线索遍历
protected:
void build(BTNode<T>* & father, BTNode<T>* & root);
void erasebyRecursion(BTNode<T>* & root);
void ToPoClueBTAssist(BTNode<T>*&root, string& str); //转换函数的辅助函数
private:
BTNode<T>* root;
bool isclued; //标记是否被线索化
bool isbuilt; //标记是否已建树
};
建树采取输入扩展先序序列递归建树的方法。
template<typename T>
void BT<T>::build()
{
if (isbuilt)
{
cout << "The binary Tree has been built , if you want to rebuild , please erase it ! " << endl;
return;
}
this->isbuilt = true;
BTNode<T>* null = NULL;
build(null, this->root);
}
template<typename T>
void BT<T>::build(BTNode<T>* & father,BTNode<T>* & root)
{
char ch = cin.get();
if (ch == '.')
{
root = NULL;