#include <iostream>
#include <stack>
using namespace std;
using std::stack;
//链表节点
template<class T>
struct Node
{
T data;
Node<T> *left;
Node<T> *right;
Node<T>(T t)
{
left=NULL;
right=NULL;
data=t;
}
};
//前序非递归
template<class T>
void preOrder(Node<T> *tree)
{
Node<T> *p=tree;
stack<Node<T> *> stk;
while(!stk.empty()||p)
{
if(p)
{
cout<<p->data<<endl;
stk.push(p);
p=p->left;
}
else
{
p=stk.top()->right;
stk.pop();
}
}
}
//中序非递归
template<class T>
void midOrder(Node<T> *tree)
{
Node<T> *p=tree;
if(!p)
return;
stack<Node<T> *> stk;
while(!stk.empty()||p)
{
while(p)
{
stk.push(p);
p=p->left;
}
p=stk.top();
cout<<p->data<<endl;
p=p->right;
stk.pop();
}
}
//后序非递归
template<class T>
void lastOrder(Node<T> *tree)
{
Node<T> *p=tree;
Node<T> *pre=p;
if(!p)
return;
stack<Node<T> *> stk;
while(!stk.empty()||p)
{
while(p)
{
stk.push(p);
p=p->left;
}
p=stk.top();
if(p->right&&p->right!=pre)
{
p=p->right;
}
else
{
cout<<p->data<<endl;
pre=p;
stk.pop();
p=NULL;
}
}
}
//后序非递归方案2,先按照根节点-右节点-左节点的顺序访问,然后reverse
template<class T>
void lastOrder(Node<T> *tree)
{
Node<T> *p=tree;
stack<Node<T> *> stk;
vector<T> vec;
while(p||!stk.empty())
{
if(p)
{
vec.push_back(p->data);
stk.push(p);
p=p->right;
}
else
{
p=stk.top()->left;
stk.pop();
}
}
reverse(vec.begin(),vec.end());
for(auto e:vec)
cout<<e<<" ";
return 0;
}
//test
int main(int argc, char* argv[])
{
Node<int> *tree=new Node<int>(1);
Node<int> *p=tree;
p->left=new Node<int>(2);
p->right=new Node<int>(3);
p=p->left;
p->left=new Node<int>(4);
p->right=new Node<int>(5);
p=p->right;
p->right=new Node<int>(6);
p->left=new Node<int>(7);
lastOrder(tree);
return 0;
}
二叉树前序、中序、后序非递归遍历
最新推荐文章于 2020-07-23 16:17:55 发布