【C++】后序线索化二叉树及其遍历

本文详细介绍了如何使用C++进行后序线索化的二叉树操作,包括如何构建后序线索二叉树以及如何进行后序遍历。通过理解线索化二叉树的概念,可以有效提升二叉树遍历的效率。
摘要由CSDN通过智能技术生成

#include<iostream>
using namespace std;

enum PointTag
{
	LINK,
	THREAD,
};
struct BinTreeThingNode
{
	char _data;
	BinTreeThingNode*_left;
	BinTreeThingNode*_right;
	PointTag _leftTag;
	PointTag _rightTag;
	BinTreeThingNode(const char &data)
		:_data(data)
		, _left(NULL)
		, _right(NULL)
		, _leftTag(LINK)
		, _rightTag(LINK)
	{}
};

class BinTreeThreading
{
public:
	BinTreeThreading(const char *str)
	{
		_CreatBinTreeThreading(_root,str);//递归创建二叉树
	}
	
	void PostThread()//后序线索化
	{
		BinTreeThingNode*prev = NULL;
		_PostOderThread(_root, prev);
	}
	
	//后序线索化的遍历
	void PostSort()
	{
		BinTreeThingNode*cur = _root;
		BinTreeThingNode *lastvisited = NULL;
		while (cur)
		{
			//一直寻找以cur为根节点的二叉树的最左边的叶子节点
			//cur->_left != lastvisited:当cur是通过其左孩子找到的时,不用又对cur进行重复找最左边的叶子节点
			while (cur&&cur->_leftTag != THREAD&& 
线索二叉树是一种特殊的二叉树,其空闲的指针域被利用起来,指向该节点在中序遍历下的前驱或后继节点,从而使得遍历操作更加高效。 线索二叉树遍历算法包括中序线索化、中序遍历、前序遍历后序遍历。其中,中序遍历是最常用的一种遍历方式,因为它能够按照节点的大小顺序输出所有节点。 下面是中序线索化的实现代码: ``` // 中序线索化 void inOrderThread(TBTNode* root, TBTNode*& pre) { if (root == NULL) { return; } inOrderThread(root->left, pre); if (root->left == NULL) { root->left = pre; root->ltag = 1; } if (pre != NULL && pre->right == NULL) { pre->right = root; pre->rtag = 1; } pre = root; inOrderThread(root->right, pre); } ``` 其中,pre是指向当前节点在中序遍历下的前驱节点的指针,初始值为NULL。在递归遍历过程中,如果当前节点的左子树为空,则将其左指针指向前驱节点,并将ltag标记为1;如果前驱节点的右指针为空,则将其右指针指向当前节点,并将rtag标记为1。最后,将pre指向当前节点,以便下一次遍历时使用。 下面是中序遍历的实现代码: ``` // 中序遍历 void inOrderTraversal(TBTNode* root) { TBTNode* p = root; while (p != NULL) { while (p->ltag == 0) { p = p->left; } cout << p->data << ' '; while (p != NULL && p->rtag == 1) { p = p->right; cout << p->data << ' '; } p = p->right; } } ``` 其中,p是指向当前节点的指针,初始值为根节点。在遍历过程中,首先向左遍历到最左边的节点,输出其值,并依次输出其后继节点的值,直到遇到右指针标记为0的节点,再向右遍历其右子树。重复以上过程,直到所有节点均被访问。 其他遍历方式的实现与中序遍历类似,只需要改变遍历顺序即可。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值