中序后序遍历

知识点总结报告

知识点:

中序遍历

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

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

}

 

 

posted @ 2018-02-03 13:29  珎珍  阅读(153)  评论(0编辑  收藏  举报