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

原创 2015年11月19日 21:12:57
//以下出现的_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;
}

相关文章推荐

二叉树的实现(递归遍历和非递归遍历)C++

二叉树的操作,使用栈构建一棵二叉树,然后求树高,递归先序遍历,中序遍历,后序遍历,访问左节点,访问右节点,非递归先序遍历输出,非递归中序遍历输出,非递归后序遍历输出。...
  • J_Anson
  • J_Anson
  • 2015年11月06日 00:32
  • 2827

数据结构-非递归遍历二叉树

  • 2017年11月16日 10:28
  • 216KB
  • 下载

C++实现链式二叉树,采用非递归的方式先序,中序,后序遍历二叉树

转自 http://blog.csdn.net/yushuai007008/article/details/7101663 如有不足之处,还望指正! [cpp] view pl...

非递归遍历二叉树

  • 2012年08月04日 09:37
  • 2KB
  • 下载

无栈非递归中跟遍历二叉树

  • 2014年11月07日 23:36
  • 412B
  • 下载

Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)

转自http://www.cnblogs.com/AnnieKim/archive/2013/06/15/MorrisTraversal.html 文主要解决一个问题,如何实现二叉树...

非递归中序遍历二叉树

  • 2013年10月22日 10:20
  • 3KB
  • 下载

数据结构-非递归遍历二叉树

根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访...

算法导论 10.4-5 O(n)时间非递归遍历二叉树

一、题目 写一个O(n)时间的非递归过程,输出给定的含n个结点的二叉树中每个结点的关键字。要求只能用除树本身以外的固定量的额外存储空间,而且在过程中不能修改该树,哪怕是暂时的 二、思考 采用类似中...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C++】非递归遍历二叉树
举报原因:
原因补充:

(最多只允许输入30个字)