【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;
}

二叉树的三种遍历方法(递归和非递归)(转载)

#include #include //STL #include using namespace std; class Tree { public: Tree *Left; Tre...
  • acdnjjjdjkdckjj
  • acdnjjjdjkdckjj
  • 2011年03月10日 17:24
  • 4182

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

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

C++实现——二叉树的四种遍历(非递归写法)

#include #include #include #include using namespace std;//结构体定义如下 typedef struct TreeNode{ //...
  • langmanqishizaijia
  • langmanqishizaijia
  • 2016年04月09日 19:27
  • 2368

C++递归创建、非递归遍历二叉树的基本操作

最近学了二叉树,这个数据结构和它的名字一样,真是二叉。如果单纯的让我想这样的算法,以笔者的脑子想一辈子都想不出来。二叉树刚学完,老师又讲了图。 俗话说,不能在一棵树上吊死,那我选择在二叉树上吊死。关键...
  • wufeifan_learner
  • wufeifan_learner
  • 2017年10月22日 16:22
  • 333

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

二叉树的遍历有三种方式,如下: (1)前序遍历(DLR),首先访问根结点,然后遍历左子树,最后遍历右子树。简记根-左-右。 (2)中序遍历(LDR),首先遍历左子树,然后访问根结点,最后遍历右子树...
  • zzvnzz
  • zzvnzz
  • 2012年10月22日 17:36
  • 1220

【数据结构与算法】二叉树深度遍历(非递归)

据说这个笔试面试的时候很容易考到,所以写到这里。 图示 代码实现 /** * 源码名称:TreeIteratorNoRecursion.java * 日期:2014-08-...
  • benbmw2008
  • benbmw2008
  • 2014年08月23日 22:55
  • 993

(编程训练)再回首,数据结构——二叉树的前序、中序、后序遍历(非递归)

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。        希望这些能提供给初学者一些参考。         在VC++6.0下可运行,当初还写了不少注释。  ...
  • u011694809
  • u011694809
  • 2015年05月28日 11:39
  • 705

二叉树学习之非递归遍历

二叉树递归遍历可谓是学过数据结构的同仁都能想一下就能写出来,但在应聘过程我们常常遇到的是写出一个二叉树非递归遍历函数,接着上篇文章写二叉树的非递归遍历,先难后易,一步一步的来.   先上代码: #...
  • callinglove
  • callinglove
  • 2014年11月02日 17:28
  • 1877

【算法导论】二叉树的前中后序非递归遍历实现

二叉树的非递归遍历
  • cyp331203
  • cyp331203
  • 2015年01月08日 20:47
  • 2149

(编程训练)再回首,数据结构——二叉树的前序、中序、后序遍历(递归)

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。        希望这些能提供给初学者一些参考。         在VC++6.0下可运行,当初还写了不少注释。  ...
  • u011694809
  • u011694809
  • 2015年05月28日 11:35
  • 704
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C++】非递归遍历二叉树
举报原因:
原因补充:

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