二叉树的非递归遍历(后序遍历的经典解法)

来源:互联网 发布:淘宝男装最出名的店铺 编辑:程序博客网 时间:2024/05/22 17:13
#include <iostream>#include <stack>using namespace std;struct node{    int value;    node* lchild;    node* rchild;};void PreOrder(node* root){    if(!root)        return;    stack<node*> view;    while(!view.empty() || root)    {        while(root)        {            cout << root->value << " ";            view.push(root);            root = root->lchild;        }        root = view.top();        view.pop();        root = root->rchild;    }}void InOrder(node* root){    if(!root)        return;    stack<node*> view;    while(!view.empty() || root)    {        while(root)        {            view.push(root);            root = root->lchild;        }        root = view.top();        cout << root->value << " ";        view.pop();        root = root->rchild;    }}void PostOrder(node* root){    if(!root)        return;    stack<node*> view;    view.push(root);    node* pre = NULL;    while(!view.empty())    {        node* cur = view.top();        if(((cur->lchild == pre || cur->rchild == pre) && pre) || (!cur->lchild && !cur->rchild))        {            cout << cur->value << " ";            view.pop();            pre = cur;        }        else        {            if(cur->rchild)                view.push(cur->rchild);            if(cur->lchild)                view.push(cur->lchild);        }    }}int main(){    node* p1 = new node {6, NULL, NULL};    node* p2 = new node {7, NULL, NULL};    node* p3 = new node {4, p1, p2};    node* p4 = new node {5, NULL, NULL};    node* p5 = new node {3, p3, p4};    cout << "preoder:";    PreOrder(p5);    cout << endl;    cout << "inorder:";    InOrder(p5);    cout << endl;    cout << "postorder:";    PostOrder(p5);    cout << endl;    return 0;}