二叉树非递归遍历

一、先序

    1.方法一

 void preorder()
{
    stack<Btnode*> s;
    Btnode *p;
    s.push(b);
    while(!s.empty())
    {
        p=s.top();
        cout<<p->data;
        s.pop();
        if(p->rchild!=NULL)
             s.push(p->rchild);
        if(p->lchild!=NULL)
             s.push(p->lchild); 
    }
    cout<<endl;
}

    2.方法二

        void pre_order()
        {
            stack<Btnode*> s;
            Btnode *p=b;
            while(!s.empty()||p!=NULL)
            {
                while(p!=NULL)
                {
                    s.push(p);
                    cout<<p->data;
                    p=p->lchild;
                }
                if(!s.empty())
                {
                    p=s.top();
                    s.pop();
                    p=p->rchild;
                }
        }
            cout<<endl;
    }

二、中序

void in_order()
{
        stack<Btnode*> s;
        Btnode *p;
        p=b;
        while(p!=NULL||!s.empty())
        {
            while(p!=NULL)
            {
                s.push(p);
                p=p->lchild;
        }
        if(!s.empty())
        {
            p=s.top();
            s.pop();
            cout<<p->data;
            p=p->rchild;
        }
    }
    cout<<endl;
}

三、后序

 

 void post_order()
        {
            stack<Btnode*> s;
            Btnode *p=b,*r;
            do
            {
                while(p!=NULL)
                {
                    s.push(p);
                    p=p->lchild;
                }
                r=NULL;
                int flag=true;
                while(!s.empty()&&flag)
                {
                    p=s.top();
                    if(p->rchild==r)
                    {
                        cout<<p->data;
                        s.pop();
                        r=p;
                    }
                    else
                    {
                        p=p->rchild;
                        flag=false;
                    }
                }
            }while(!s.empty());
            cout<<endl;
         }

四、范例

#include<iostream>
#include<string>
#include<stack>
using namespace std;
const int max_size=100;
struct Btnode
{
    char data;
    Btnode *lchild;
    Btnode *rchild;
};
class Btree
{ 
    Btnode *b;
    public:
        Btree():b(NULL) {}
        ~Btree()
        {
            destroy(b);
        }
        void destroy(Btnode *&b1)
        {
            if(b1!=NULL)
            {
                destroy(b1->lchild);
                destroy(b1->rchild);
                delete b1;
            }
        }
         void make_Btree()
        {
            Btnode *st[max_size],*p;
            string str;
            int k,j=0,top=-1;
            b=NULL;
            cout<<"请输入括号表示的二叉树:";
            cin>>str;
            for(int i=0;i<str.size();i++)
            {
                switch(str[i])
                {
                    case '(':st[++top]=p;k=1;break;
                    case ')':top--;break;
                    case ',':k=2;break;
                    default :
                             p=new Btnode;
                             p->data=str[i];
                             p->lchild=p->rchild=NULL;
                             if(b==NULL)
                                 b=p;
                             else
                             {
                                 switch(k)
                                 {
                                     case 1:st[top]->lchild=p;break;
                                     case 2:st[top]->rchild=p;break;
                                 }
                             }             
                }
            }
        }
        void post_order()
        {
            stack<Btnode*> s;
            Btnode *p=b,*r;
            do
            {
                while(p!=NULL)
                {
                    s.push(p);
                    p=p->lchild;
                }
                r=NULL;
                int flag=true;
                while(!s.empty()&&flag)
                {
                    p=s.top();
                    if(p->rchild==r)
                    {
                        cout<<p->data;
                        s.pop();
                        r=p;
                    }
                    else
                    {
                        p=p->rchild;
                        flag=false;
                    }
                }
            }while(!s.empty());
            cout<<endl;
         } 
};
int main()
{
    Btree t;
    t.make_Btree();
    t.post_order();
    return 0;
 } 
View Code

 

posted @ 2018-11-28 19:46  shenyuli  阅读(162)  评论(0编辑  收藏  举报
Live2D