【数据结构】实验报告11 将二叉树后序线索化并进行后序遍历

本文介绍了如何设计和实现后序线索二叉树的非递归后序遍历算法,包括实验目的、环境、详细设计和测试结果。通过创建二叉树、线索化和非递归遍历,展示了对数据结构和算法的理解。
摘要由CSDN通过智能技术生成

一、实验目的和要求

目的:设计并实现基于后序线索二叉树的后序遍历的非递归算法。
要求:
(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;
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值