zoukankan      html  css  js  c++  java
  • 二叉树非递归遍历

    一、先序

        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
  • 相关阅读:
    Cordova原理一
    View 的measure 和onMeasure
    Android Material Design 系列之 SnackBar详解
    android 透明状态栏方法及其适配键盘上推(二)
    android 透明状态栏方法及其适配键盘上推(一)
    Https握手协议以及证书认证
    App对接支付宝移动支付功能
    ViewPager 滑动一半的判断方法以及左滑右滑判断
    mvp架构解析
    解决IE8打开默认弹出开发者工具的问题
  • 原文地址:https://www.cnblogs.com/shenyuling/p/10034190.html
Copyright © 2011-2022 走看看