• 二叉树 遍历


    这是N年前写的代码

    void inorder(BTCHINALR *bt)
    /*中序遍历二叉树(递归算法)*/
    {

      if(bt != NULL){ 
           inorder(bt->lchild);
         printf("%c  ",bt->data);
        inorder(bt->rchild);

       }
    }
    void lastorder(BTCHINALR *bt)
    /*后序遍历二叉树(递归算法)*/

       if(bt != NULL){ 
           lastorder(bt->lchild);
         lastorder(bt->rchild);
         printf("%c  ",bt->data);
      }
    }
    void firstorder(BTCHINALR *bt)
    /*先序遍历二叉树(递归算法)*/

       if(bt != NULL){
             printf("%c  ",bt->data); 
             firstorder(bt->lchild);
           firstorder(bt->rchild);

      }
    }

    void  firstorder_notrecursive(BTCHINALR  *bt)
    /*先序遍历二叉树(非递归算法)*/
    {

        BTCHINALR  *q,  *s[20];
          int  top = 0;
          int  bool = 1;
          q = bt;
         do {while(q != NULL)
              { 

          top ++; 

          s[top] = q;

          printf("%c  ",q->data); 

          q = q->lchild;

        }
            if(top == 0)  

         bool = 0;
            else { q = s[top];
            top --;
            q = q->rchild; }
      }while(bool);

    }
    void  lastorder_notrecursive_1(BTCHINALR  *bt)
    /*后序遍历二叉树_1(非递归算法)*/
    {

      BTCHINALR  *q,  *s[20];
        int  top = 0;
          int  bool = 1;
          int  i=0;
          char data[100];
          q = bt;
         do

      {

        while(q != NULL)
              {  top ++;  s[top] = q; i++;data[i]=q->data;  q = q->rchild; }
            if(top == 0)   bool = 0;
               else { q = s[top];
            top --;
            q = q->lchild;

      }
      }while(bool);
      for(i;i>0;i--) printf("%c  ",data[i]);
    }
    void  lastorder_notrecursive_2(BTCHINALR  *bt)
    /*后序遍历二叉树_2(非递归算法)*/
    {BTCHINALR  *q, *s[20];
      int  top = 0;
      int  bool = 1;
      int bar[20];//一个节点第二次遍历无效的标记
      q = bt;
      do {while(q != NULL){ 
       top ++;  s[top]= q;bar[top]=1;q = q->lchild; }//遍历左子树
           if(top==0) bool=0;
           else { if(s[top]->lchild==NULL&&s[top]->rchild!=NULL&&bar[top]==1);//如果左子树不存在,则进行右子树遍历
           else  {q = s[top];
           top --;
        printf("%c  ",q->data);}//输出遍历结果
        if(bar[top]==2||top==0) q=NULL;//节点只能遍历一次.top为零,遍历结束
        else {q =  s[top];
              bar[top]=bar[top]+1;//标记遍历次数
                 q = q->rchild; }//右子树遍历
       
        }
      }while(bool);

    }
    void  inorder_notrecursive(BTCHINALR  *bt)
    /*中序遍历二叉树(非递归算法)*/
    {BTCHINALR  *q,  *s[20];
      int  top = 0;
      int  bool = 1;

      q = bt;
      do {while(q != NULL)
              {  top ++;  s[top] = q;   q = q->lchild; }
           if(top == 0)   bool = 0;
           else { q = s[top];
           top --;
           printf("%c  ",q->data);
           q = q->rchild; }
      }while(bool);
     }

  • 相关阅读:
    制作Autorun的CD
    Sybase ASE MDA tables 装不上怎么办?
    对于TStringList.Find函数,我有话要说
    HH.exe CHM Operator Command.
    Delphi 7的一些常用的快捷键
    Explain Plan
    在Delphi中的Log
    subst windows下实用的磁盘映射工具
    Excel 2007 如何冻结多行&多列
    LinqToDataTable[转]
  • 原文地址:https://www.cnblogs.com/pbreak/p/1750850.html
Copyright © 2020-2023  润新知