zoukankan      html  css  js  c++  java
  • 中序后序遍历

    知识点总结报告

    知识点:

    中序遍历

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

    (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);                  //销毁栈

    }

     

     

  • 相关阅读:
    java 9+版本中,接口的内容总结
    发红包的案例
    java中成员变量和局部变量的区别
    分别使用面向对象和面向过程两个不同的思路编写代码,打印输出一个数组,输出数组的格式:“[10,20,30,40,50]”
    题目要求:不能使用新数组,就用原来的唯一的数组进行反转
    request.getRequestDispatcher()和response.sendRedirect()区别
    Maven是什么
    字符串中的各种方法
    数组中的各种方法
    字符串的模式匹配方法-match-search-repalce
  • 原文地址:https://www.cnblogs.com/li1997/p/8409205.html
Copyright © 2011-2022 走看看