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
  • 相关阅读:
    隐马尔可夫模型(一)
    酒罢问君三语
    Reveal使用教程
    李洪强和你一起学习前端之(8)CSS复习
    李洪强和你一起学习前端之(7)定位盒子 css可见性 滑动门案例
    李洪强和你一起学习前端之(6)浮动 布局 定位
    李洪强和你一起学习前端之(5)css书写位置 优先级和伪类
    李洪强和你一起学习前端之(4)HTML5介绍
    李洪强和你一起学习前端之(3)Css基础和选择器
    李洪强和你一起学习前端之(2)表格、表单、标签语义化
  • 原文地址:https://www.cnblogs.com/shenyuling/p/10034190.html
Copyright © 2011-2022 走看看