20170926_二叉树遍历_非递归

20170926_二叉树遍历_非递归


//二叉树遍历_非递归

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<numeric>
#include<functional>
#include<queue>	//队列
#include<stack>	//栈
#include<deque>	//双端队列
#include<list>	//双向链表
using namespace std;

/*队列:queue的操作
1、empty():如果队列为空,返回真
2、size():返回队列中元素的个数
3、push(x):在队尾添加一个元素
4、pop():删除队头的第一个元素
5、front():返回队头元素
6、back():返回队尾元素
*/
/*栈:stack的操作
1、empty():如果栈为空,返回真
2、size():返回栈中元素的个数
3、push(x):从栈顶添加一个元素
4、pop():从栈顶删除第一个元素
5、top():返回栈顶元素
*/
struct BinTreeNode
{
	int value;
	BinTreeNode *pLeft;
	BinTreeNode *pRight;
	BinTreeNode(int x):value(x),pLeft(nullptr),pRight(nullptr) {};
};

/*二叉树层序遍历_非递归*/
//借助队列:queue
void LeverOrder(BinTreeNode *root)
{
	if(root==nullptr)
		return;
	queue<BinTreeNode *> q;			//借助队列
	q.push(root);
	BinTreeNode *top;
	while(!q.empty())
	{
		top=q.front();				//取出队头元素
		cout<<top->value<<",";
		q.pop();					//删除队头元素
		if(top->pLeft != nullptr)
			q.push(top->pLeft);
		if(top->pRight != nullptr)
			q.push(top->pRight);
	}
}

/*二叉树前序遍历_非递归*/
void PreOrder(BinTreeNode *root)
{
	if(root==nullptr)
		return;
	stack<BinTreeNode *> s;
	while(root!=nullptr || !s.empty())	//当根节点不为空,或者栈不为空时
	{
		while(root!=nullptr)			//当根节点不为空时
		{
			cout<<root->value<<",";		//打印出节点值
			s.push(root);
			root=root->pLeft;
		}
		if(!s.empty())					//一旦到达左子节点末尾,当栈不为空
		{
			root=s.top();
			s.pop();
			root=root->pRight;			//转移到右子节点
		}
	}
}

/*二叉树中序遍历_非递归*/
void InOrder(BinTreeNode *root)
{
	if(root==nullptr)
		return;
	stack<BinTreeNode *> s;
	while(root!=nullptr || !s.empty())	//当根节点不为空,或者栈不为空
	{
		while(root!=nullptr)			//当根节点不为空
		{
			s.push(root);
			root=root->pLeft;
		}
		if(!s.empty())					//一旦到达左子节点末尾,当栈不为空
		{
			root=s.top();
			cout<<root->value<<",";		//打印出节点值
			s.pop();
			root=root->pRight;			//转移到右子节点
		}
	}
}

/*二叉树后序遍历_非递归*/
//非递归实现:后序遍历的过程比较麻烦,有些节点需要遍历两遍(含有右子树的那些节点),
//所以通过设置一个标志位来标志节点的当前遍历次数。
void PostOrder(BinTreeNode* root)
{
    if(root==NULL)
        return;
    else
	{
        stack<BinTreeNode*> s;
        stack<int> v;
        while(root!=nullptr)
		{
            s.push(root);
            v.push(0);
            root=root->pLeft;
		}
        while(!s.empty())
		{
            root=s.top();
            while(root->pRight && v.top()==0)            
			{
                v.pop();
                v.push(1);
                root=root->pRight;
                s.push(root);
                v.push(0);
                while(root->pLeft!=nullptr)
				{
                     s.push(root);
                     v.push(0);
                     root=root->pLeft;
                }
           }
           root=s.top();
		   cout<<root->value<<",";
           s.pop();
           v.pop();
        }
    }
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值