1. 程式人生 > >前序遍歷

前序遍歷

原理 nod pre null 前序 order oid preorder pri

知識點總結報告

知識點:

前序遍歷

(原理)前序遍歷二叉樹過程

(1)訪問根結點

(2)先序遍歷左子樹

(3)先序遍歷右子樹

  中序遍歷遞歸算法

void PreOrder(BTNode *b) //先序遍歷的遞歸算法

{   if (b!=NULL)

   {  printf("%c ",b->data); //訪問根節點

    PreOrder(b->lchild); //遞歸訪問左子樹
     PreOrder(b->rchild); //遞歸訪問右子樹
  }
}

  前序遍歷非遞歸算法

采用順序棧存儲結構,類型聲明如下

typedef struct                //存放棧中數據元素

{  BTNode * data[MaxSize];         //存放棧頂指針

  int top;                  //順序棧存儲類型

}SqStack;

非遞歸算法1

void PreOrder1(BTNode *b)            //先序非遞歸遍歷算法1

{  BTNode *p;                 

  SqSack *st;                //定義棧指針st

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

  if(b!=NULL)

  {  Push(st,b);              //根結點進棧

    while(!=StackEmpty(st))        //棧不為空時循環

    {  Pop(st,p);            //退棧結點p並訪問它

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

      if(p->rchild!=NULL)        //有右孩子時將其進棧

        Push(st,p->rchild);    

      if(p->lchild!=NULL)         //有左孩子時將其進棧

        Push(st,p->lchild);

    }

    printf("\n");

  }

  DestroyStack(st);              //銷毀棧

}

二叉鏈表中前序遍歷非遞歸算法

void PreOrder2(BTNode *b)              //先序遍歷非遞歸算法2

{  BTNode *p;

  SqStack *st;                   //定義一個順序棧指針st

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

  p=b;

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

  {  while(p!=NULL)               //訪問結點p及其所有左下結點並進棧

     {  printf("%c",p->data);          //訪問結點p

       Push(st,p);              //結點p進棧

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

     }

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

     {  Pop(st,p);              //出棧結點p

       p=p->rchild;              //轉向處理其右子樹

     }

  }

  printf("\n");

  DestroyStack(st);                //銷毀棧

}                       

前序遍歷