• 中序后序遍历


    知识点总结报告

    知识点:

    中序遍历

    (原理)中序遍历二叉树过程

    (1)中序遍历左子树

    (2)访问根结点

    (3)中序遍历右子树

      中序遍历递归算法

    void InOrder(BTNode *b)         //中序遍历的递归算法

    {  if (b!=NULL)

      {  InOrder(b->lchild);     //递归访问左子树

          printf("%c ",b->data);  //访问根节点
         
     InOrder(b->rchild);     //递归访问右子树
       
    }
    }

      中序遍历非递归算法

    void InOrder1(BTNode *b)              //中序遍历非递归算法

    {  BTNode *p;

      SqStack *st;                   //定义一个顺序栈指针st

      InitStack(st);                   //初始化栈st

      p=b;

      while(!StackEmpty(st)||p!=NULL)

      {  while(p!=NULL)               //扫描结点p的所有左下结点并进栈

         {  Push(st,p);              //结点p进栈

           p=p->lchild;              //移动到左孩子

         }

         if(!StackEmpty(st))             //若栈不空

         {  Pop(st,p);              //出栈结点p

            printf("%c",p->data);          //访问结点p

           p=p->rchild;              //转向处理其右子树

         }

      }

      printf("\n");

      DestroyStack(st);                //销毁栈

    } 

     

     

    后序遍历

    (原理)后序遍历二叉树过程

    (1)后序遍历左子树

    (2)后序遍历右子树

    (3)访问根结点

      后序遍历递归算法

    void PostOrder(BTNode *b)       //后序遍历的递归算法

    {  if (b!=NULL)

       {  PostOrder(b->lchild);   //递归访问左子树
          PostOrder(b->rchild);   //递归访问右子树
          printf("%c ",b->data);  //访问根节点
       }
    }

      后序遍历非递归算法

    void PostOrder1(BTNode *b)              //后序遍历非递归算法

    {  BTNode *p,*r;

      SqStack *st;                   //定义一个顺序栈指针st

      InitStack(st);                   //初始化栈st

      p=b;

      do

      {  while(p!=NULL)               //扫描结点p的所有左下结点并进栈

         {  Push(st,p);              //结点p进栈

           p=p->lchild;              //移动到左孩子

         }

         r=NULL;                  //r指向刚访问的结点,初始时为空

         Flag=true;                  //flag为真表示正在处理栈顶结点

         while(!StackEmpty(st)&&flag)

         {  GetTop(st,p);              //取出当前的栈顶结点p

            if(p->rchild==r)             //若结点p的右孩子为空或者为刚刚访问过的结点

            {  printf("%c",p->data);        //访问结点p

              Pop(st,p);

              r=p;               //r指向刚访问过的结点

            }

            else

            {  p=p->rchild;          //转向处理其右子树

              flag=false;           //表示当前不是处理栈顶结点

            }

         }

      }while(!StackEmpty(st));            //栈不空循环

      printf("\n");

      DestroyStack(st);                  //销毁栈

    }

     

     

  • 相关阅读:
    文件上传笔记
    使用customize-cra,react-app-rewired扩展create-react-app
    regeneratorRuntime is not defined报错处理
    gulp使用笔记
    pyinstaller打包带图标时报错问题
    不使用npm eject 修改create-react-app的wepack配置less-loader
    mockjs使用笔记
    树莓派安装TPLINK_WN725n v2网卡驱动
    csv数据文件如何设置
    Jmeter多线程token传递
  • 原文地址:https://www.cnblogs.com/li1997/p/8409205.html
Copyright © 2020-2023  润新知