二叉树的非递归中序线索化以及递归的中序线索化

非递归的中序线索化:我觉得重点考虑在最后一个结点的时候,由于栈的元素为空。所以为了避免使得最后一个结点的元素指向野指针,那么我们必须将结点的右指针指向null进行外部设置。

中序非递归遍历的代码

cpp 复制代码
Node* previous = NULL;
void InOrderSack(Node* root)
{
	stack<Node*> stk;
	if (root == NULL)
	{
		return;
	}
	Node* tmpnode = NULL;
	tmpnode = root;
	while (tmpnode||!stk.empty())
	{
		while (tmpnode!=NULL)
		{
			stk.push(tmpnode);
			tmpnode = tmpnode->lchild;
		}/*已经到了左起点*/
		if (!stk.empty())
		{
			tmpnode = stk.top();
			stk.pop();
			if (tmpnode->lchild == NULL)
			{
				tmpnode->lchild = previous;
				tmpnode->ltag = 1;
			}
			cout << tmpnode->data << endl;
			if (previous->rchild == NULL && previous !=NULL)
			{
				previous->rchild = tmpnode;
				previous->rtag = 1;
			}
			previous = tmpnode;
			tmpnode = tmpnode->rchild;
		}
	}
	previous->rchild = NULL;//最后一个结点的后继结点设置为null
	previous->rtag = 1;
}

中序递归遍历的代码

cpp 复制代码
Node* previous = NULL;
void InOrder(Node* root)
{
	if (root == NULL)
	{
		return;
	}
	Node* tmpnode = NULL;
	tmpnode = root;
	InOrder(tmpnode->lchild);
	if (tmpnode->lchild == NULL)
	{
		tmpnode->lchild = previous;
		tmpnode->ltag = 1;
	}
	if (previous->rchild == NULL && previous !=NULL)
	{
		previous->lchild = tmpnode;
		previous->rtag = 1;
	}
	previous = root;
	cout << tmpnode->data << endl;
	InOrder(tmpnode->rchild);
}

个人感觉中序递归遍历更加简单一点

回顾先序遍历线索化流程

cpp 复制代码
Node* previous;
void PreOrder(Node* root)
{
	//先访问根结点 再访问左子树  再访问右子树
	if (root == NULL)
	{
		return;
	}
	//根结点不为空
	cout << root->data << endl;
	Node* tmpnode = NULL;
	tmpnode = root;
	if (tmpnode->lchild == NULL )
	/*上一层传入的pre使得本层结点的左子树指向上一层的先驱结点*/
	{
		tmpnode->lchild = previous;
		tmpnode->ltag = 1;
	} 
	if (previous->rchild == NULL && previous != NULL)
		/*这里的previous保存的是上一个遍历的结点
		因此如果在上一个结点的递归中,它的右子树为空
		那么在它返回的下一个递归调用执行的结点,就可以当成它
		右子树的连接结点也就是后继结点使用*/
	{
		previous->rchild = root;
	}
	previous = tmpnode;
	/*遍历左子树和右子树*/
	if (tmpnode->ltag == 0)
	{
		PreOrder(tmpnode->lchild);
	}
	if (tmpnode->rtag ==0)
	{
		PreOrder(tmpnode->rchild);
	}
}
相关推荐
古希腊掌管学习的神3 分钟前
[搜广推]王树森推荐系统笔记——曝光过滤 & Bloom Filter
算法·推荐算法
qystca4 分钟前
洛谷 P1706 全排列问题 C语言
算法
浊酒南街10 分钟前
决策树(理论知识1)
算法·决策树·机器学习
就爱学编程18 分钟前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
学术头条23 分钟前
清华、智谱团队:探索 RLHF 的 scaling laws
人工智能·深度学习·算法·机器学习·语言模型·计算语言学
Schwertlilien1 小时前
图像处理-Ch4-频率域处理
算法
IT猿手1 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解TP1-TP10及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·深度学习·算法·机器学习·matlab·多目标算法
__lost1 小时前
MATLAB直接推导函数的导函数和积分形式(具体方法和用例)
数学·算法·matlab·微积分·高等数学
thesky1234561 小时前
活着就好20241224
学习·算法
ALISHENGYA1 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战项目二)
数据结构·c++·算法