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();
}
}
}