【C++】非递归遍历二叉树

本文介绍了如何使用栈非递归地遍历二叉树,包括先序遍历、中序遍历和后序遍历的详细实现方法。通过栈来模拟递归过程,有效地避免了递归带来的额外开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//以下出现的_root标示二叉树的根节点

//非递归先序遍历(根节点->左节点->右节点)思想:即用栈实现
//遍历二叉树的前提条件是:该二叉树不为空。在满足该条件的情况下,进行以下步骤:
//1.先将二叉树的根节点push进栈。
//2.在该栈不为空的条件下,执行一个循环(先用top保存栈顶元素,再对栈进行pop操作,因为栈具有后进先出的特点
//  ,所以先对top->_right进行判断是否入栈,再对top->_left进行判断是否入栈)。
//3.当栈为空时,先序遍历该二叉树结束。
void RootSort()
{
	stack<BinaryTreeNode*>s;
	if (_root != NULL)
	{
		s.push(_root);
	}
	while (!s.empty())
	{
		BinaryTreeNode*top = s.top();
		s.pop();
		cout << top->_value << " ";
		if (top->_right)
		{
			s.push(top->_right);
		}
		if (top->_left)
		{
			s.push(top->_left);
		}
	}
	cout << endl;
}


//非递归中序遍历(左节点->根节点->右节点)思想:即用栈实现
// 因为中序遍历二叉树的特点,所以在当前节点cur不为空或栈不为空的条件下(在该条件下的原因:该条件说明
// 未遍历完二叉树),开始执行循环体,进行遍历:
//(1)从当前节点cur开始,以cur为循环条件,当cur不为空时,将cur入栈,然后以cur=cur->_left跟进,直至
//     将该二叉树的最左节点入栈后,入栈操作结束
//(2)取栈顶节点:先保存该节点(用top保存该节点的原因:还要考虑该节点的右孩子)并输出该节点的值,
//	   然后执行栈的pop操作。
//(3)继续以top->_right为cur值,转(1)操作.
void MidSort()
{
	stack<BinaryTreeNode*>s;
	BinaryTreeNode*cur = _root;
	while (cur || !s.empty())
	{
		while (cur)
		{
			s.push(cur);
			cur = cur->_left;
		}
		BinaryTreeNode*top = s.top();
		s.pop();
		cout << top->_value << " ";
		cur = top->_right;
	}
	cout << endl;
}



//非递归后序遍历(左节点->右节点->根节点)思想:即用栈实现
//(1)在当前节点cur不为空或栈不为空的条件下(在该条件下的原因:该条件说明未遍历完二叉树)。
//(2)从当前节点cur开始,以cur为循环条件,当cur不为空时,将cur入栈,然后以cur=cur->_left跟进,直至
//     将该二叉树的最左节点入栈后,入栈操作结束。取栈顶节点top:先保存该节点(用top保存该节点的原因:
//     还要考虑该节点的右孩子),
//(3)若top->_right==NULL || lastVisited == top->_right,则输出top->_value,执行栈的pop操作,并执行lastVisited = top(
//    用lastVisited保存最近一个所输出的节点,待到下一次同样的操作时,若lastVisited == top->_right,则
//    说明top的右节点已经访问过了,可以访问top了,否则会陷在cur = top->_right这步操作里);
//(4)若条件(3)不满足,则继续以top->_right为cur值,转(1)操作.
void BackSort()
{
	stack<BinaryTreeNode*>s;
	BinaryTreeNode*cur = _root;
	BinaryTreeNode*lastVisited =NULL;
	while (cur || !s.empty())
	{
		while (cur)
		{
			s.push(cur);
			cur = cur->_left;
		}
		BinaryTreeNode*top = s.top();
		if (top->_right == NULL || lastVisited == top->_right)
		{
			s.pop();
			cout << top->_value << " ";
			lastVisited = top;
		}
		else
		{
			cur = top->_right;
		}
	}
	cout << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值