zoukankan      html  css  js  c++  java
  • 二叉树的遍历

    #include<iostream>
    //#include<queue>//队列
    using namespace std;
    //二叉树的二叉链表存储表示
    typedef struct BiNode
    {    
     char data;      //结点数据域
     struct BiNode *lchild,*rchild; //左右孩子指针
    }BiTNode,*BiTree;
    //链栈的定义
    typedef struct StackNode
    {
     BiTNode data;
     struct StackNode *next;
    }StackNode,*LinkStack;
    void CreateBiTree(BiTree &T)
    { 
     //按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
     char ch;
     cin >> ch;
     if(ch=='#')  T=NULL;   //递归结束,建空树
     else{       
      T=new BiTNode;
      T->data=ch;     //生成根结点
      CreateBiTree(T->lchild); //递归创建左子树
      CreateBiTree(T->rchild); //递归创建右子树
     }        //else
    } 
     //用算法5.1 中序遍历的递归算法       
    void InOrderTraverse(BiTree T)
    {  
     //中序遍历二叉树T的递归算法
     if(T){
      InOrderTraverse(T->lchild);
      cout << T->data;
      InOrderTraverse(T->rchild);
     }
    }
    void InitStack(LinkStack &S)
    {
     //构造一个空栈S,栈顶指针置空
     S=NULL;
    }
    bool StackEmpty(LinkStack S)
    {
     if(!S)
      return true;
     return false;
    }
    void Push(LinkStack &S,BiTree e)
    {
     //在栈顶插入元素*e
     StackNode *p=new StackNode;
     p->data=*e;
     p->next=S;
     S=p;
    }
    void Pop(LinkStack &S,BiTree e)
    {
     if(S!=NULL)//原书上写的是if(S==NULL)return ERROR;
     { 
      *e=S->data;
      StackNode *p=S;
      S=S->next;
      delete p;
     }
    } 
      
    void InOrderTraverse1(BiTree T)
    { 
      // 中序遍历二叉树T的非递归算法
     LinkStack S; BiTree p;
     BiTree q=new BiTNode;
     InitStack(S); p=T;
     while(p||!StackEmpty(S))
     {
      if(p) 
      {                
       Push(S,p);    //p非空根指针进栈,遍历左子树
       p=p->lchild;
      }       
      else
      {                 
       Pop(S,q);               //p为空根指针退栈,访问根结点,遍历右子树
       cout<<q->data;
       p=q->rchild; 
      }
     }        // while
    }         // InOrderTraverse
    //层次遍历二叉树
    void LevelOrderTraverse(BiTree T)
    {
     BiTree Queue[100],p=T;
     int  front=0 , rear=0 ;
     if  (p!=NULL) 
     {  
      Queue[rear++]=p;    /*   根结点入队  */
     
      //补充代码
      while(front != rear)
      {
       p = Queue[front++];
       cout<<p->data<<ends;
       if(p->lchild)
       Queue[rear++]=p->lchild; 
       if(p->rchild)
       Queue[rear++]=p->rchild; 
      }
      
    
    
     }
    }
    int main()  
    {  
     //12##3##
     //ABDH##I##E#J##CF#K##G###//
        BiTree tree;
     cout<<"请输入建立二叉链表的先序序列:
    ";
     CreateBiTree(tree);
     cout<<"中序遍历的结果为:"<<endl;
     cout<<"1.递归算法结果为:
    ";
     InOrderTraverse(tree);
     cout<<endl;
     cout<<"2.非递归算法结果为:
    ";
     InOrderTraverse1(tree);
     cout<<endl;
     cout<<"层次遍历结果为:"<<endl;
     LevelOrderTraverse(tree);
     cout<<endl;
        return 0;  
    } 
    


  • 相关阅读:
    python简单学------------python基础、print,input,if判断等
    fread读取大文件以及返回值问题(转载)
    github的使用---git版本控制
    python中split函数的使用
    快递小哥逆袭自传:用了6年时间做到了IT部门主管
    Linux系统默默改变了人类世界的生活方式
    浅谈Linux系统运维工程师必备技能
    Linux运维工程师真实的工作状态到底是怎么样的?
    想要学习Linux技术,先好好的读一本Linux书籍吧
    女生可不可以进入IT行业做Linux运维工程师?
  • 原文地址:https://www.cnblogs.com/didiaodidiao/p/9387883.html
Copyright © 2011-2022 走看看