• 二叉树的遍历(转)


    #include <iostream>
    #include <stack>
    #include <queue>

    using namespace std;

    typedef struct Node
    {
      int data;
      Node *lchild,*rchild;
    }btree;

    //创建二叉树

    btree *create(int a[],int n, int i)
    {
      btree *t;
      if(i>n)
        t=NULL;
      else
      {
        t=new btree;
        t->data=a[i-1];
        t->lchild=create(a,n,2*i);
        t->rchild=create(a,n,2*i+1);
      }

      return t;
    }



    //递归前序遍历

    void preorder(btree *p)
    {
      if(p!=NULL)
      {
        cout<<p->data<<endl;
        preorder(p->lchild);
        preorder(p->rchild);
      }
    }

    //非递归前序遍历

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

    //递归中序遍历

    void inorder(btree *p)
    {
      if(p!=NULL)
      {
        inorder(p->lchild);
        cout<<p->data<<endl;
        inorder(p->rchild);
      }
    }

    //非递归中序遍历

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

    //递归后续遍历

    void postorder(btree *p)
    {
      if(p!=NULL)
      {
        postorder(p->lchild);
        postorder(p->rchild);
        cout<<p->data<<endl;
      }
    }

    struct node
    {
    btree *t;
    int flag;
    };

    //非递归后续遍历

    void postorder1(btree *p)
    {
      stack<node> s;
      node post;
      while(!s.empty()||p!=NULL)
      {
        while(p!=NULL)
        {
          post.t=p;
          post.flag=0;
          s.push(post);
          p=p->lchild;
        }
        if(!s.empty())
        {
          post=s.top();
          s.pop();
            if(post.flag==0)
            {
              post.flag=1;
              s.push(post);
              p=(post.t)->rchild;
            }
            else
            {
              cout<<(post.t)->data<<endl;
              p=NULL;
            }
        }
      }
    }

    //非递归层次遍历

    void layerorder(btree *p)
    {
      queue<btree *>q;
      btree *t;
      if(p!=NULL)
        q.push(p);
      while(!q.empty())
      {
        t=q.front();
        cout<<t->data<<endl;
        q.pop();
        if(t->lchild!=NULL)
          q.push(t->lchild);
        if(t->rchild!=NULL)
          q.push(t->rchild);
      }
    }

    //交换左右子树

    void exchange(btree *p)
    {
      btree *t;
      if(p!=NULL)
      {
        t=p->lchild;
        p->lchild=p->rchild;
        p->rchild=t;
        exchange(p->lchild);
        exchange(p->rchild);
      }
    }

    int main()
    {
      btree *root;
      int a[7]={1,2,3,4,5,6,7};
      root=create(a,7,1);
      cout<<"preorder:"<<endl;
      preorder(root);
      cout<<"preorder1:"<<endl;
      preorder1(root);
      cout<<"inorder"<<endl;
      inorder(root);
      cout<<"inorder1"<<endl;
      inorder1(root);
      cout<<"postorder"<<endl;
      postorder(root);
      cout<<"postorder1"<<endl;
      postorder1(root);
      cout<<"layerorder"<<endl;
      layerorder(root);
      exchange(root);
      cout<<"After exchange(layerorder):"<<endl;
      layerorder(root);
      return 0;
    }


    
    



  • 相关阅读:
    Linux下使用wireshark权限问题
    Ubuntu关机出错卡死 PCIe Bus Error: severity=Corrected, type=Physical Layer, id=00e5(Receiver ID)
    东南大学《操作系统》课程作业 第二章
    东南大学《操作系统》课程作业 第一章
    东南大学《操作系统》课程作业 第三章
    回溯算法
    拓扑排序之课程表问题
    C++虚函数多态
    JMETER安装及基本使用
    JMETER正则表达式提取器使用
  • 原文地址:https://www.cnblogs.com/jasonliu/p/2407789.html
Copyright © 2020-2023  润新知