• 二叉树的遍历


    #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;  
    } 
    


  • 相关阅读:
    渗透测试学习 二十一、 JSP相关漏洞
    渗透测试学习 二十、 其他漏洞汇总之PHP相关漏洞
    渗透测试学习 十九、 XSS跨站脚本漏洞详解 续2
    渗透测试学习 十八、 XSS跨站脚本漏洞详解 续
    渗透测试学习 十七、 XSS跨站脚本漏洞详解
    渗透测试学习 十六、 常见编辑器漏洞解析
    渗透测试学习 十五、 文件上传&&解析漏洞
    渗透测试学习 十四、 脚本木马的制作与原理
    渗透测试学习 十三、 SQLmap使用详解
    渗透测试学习 十二、 其他注入漏洞汇总 续
  • 原文地址:https://www.cnblogs.com/didiaodidiao/p/9387883.html
Copyright © 2020-2023  润新知