非递归前序遍历二叉树,请看这里。
非递归后序遍历二叉树:
遍历时,除了用栈保存子树根节点,还要保存对子树根节点的访问次数。
#include<stack>
#include <utility>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
struct node
{
node* left;
node* right;
int value;
node(node* l, node* r, int v)
{
left = l;
right = r;
value = v;
}
};
void postorder(node* root)
{
stack<pair<node*,int>> st;
while(!st.empty() || root)
{
while(root)
{
st.push(pair<node*,int>(root, 1));
root = root->left;
}
while(!st.empty() && st.top().second==2)
{
root = st.top().first;
printf("%d|",root->value);
st.pop();
}
if( st.top().second == 1 )
{
root = st.top().first->right;
st.top().second++;
}
}
}
int main()
{
node * n1 = new node(NULL, NULL, 1);
node * n2 = new node(NULL, NULL, 2);
node * n3 = new node(NULL, NULL, 3);
node * n4 = new node(NULL, NULL, 4);
node * n5 = new node(n1, n2, 5);
node * n6 = new node(n3, n4, 6);
node * n7 = new node(n5, n6, 7);
postorder(n7);
}