关闭

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

标签: 非递归遍历二叉树用栈实现二叉树的遍历
299人阅读 评论(0) 收藏 举报
分类:
//以下出现的_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;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:56173次
    • 积分:2175
    • 等级:
    • 排名:第18021名
    • 原创:170篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    文章分类
    最新评论