前序遍历

知识点总结报告

知识点:

前序遍历

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

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

}                       

 

 

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