数据结构 二叉树遍历

来源:互联网 发布:美国网络课程 编辑:程序博客网 时间:2024/05/10 17:19

/*################# Preorder Traverse begin ###################################################################*/
先序遍历:
1递归算法
void  PreorderTraverse(BTNode  *T)

 if (T!=NULL)
 {
  visit(T->data) ;       /*  访问根结点  */
  PreorderTraverse(T->Lchild) ;
  PreorderTraverse(T->Rchild) ;    
 }
}

2  非递归算法
设T是指向二叉树根结点的指针变量,非递归算法是:
若二叉树为空,则返回;否则,令p=T;
⑴ 访问p所指向的结点;
⑵ q=p->Rchild ,若q不为空,则q进栈;
⑶ p=p->Lchild ,若p不为空,转(1),否则转(4);
⑷  退栈到p ,转(1),直到栈空为止。
算法实现:
#define  MAX_NODE  50
void  PreorderTraverse( BTNode  *T)

 BTNode  *Stack[MAX_NODE] ,*p=T, *q ;
 int  top=0 ;
 if  (T==NULL)  printf(“ Binary Tree is Empty!\n”) ;
 else
 {
  do
  {
   visit( p-> data ) ;  
   q=p->Rchild ;
   if  ( q!=NULL ) 
   {
    stack[++top]=q ;
   }
   p=p->Lchild;
   if (p==NULL)
   {
    p=stack[top] ; 
    top-- ;
   }
  }
  while (p!=NULL) ;
 }
}
/*################# Preorder Traverse end ###################################################################*/

/*################# InorderTraverse begin ###################################################################*/
递归算法:
void  InorderTraverse(BTNode  *T)

 if(T!=NULL)
 {
  InorderTraverse(T->Lchild) ;
  visit(T->data) ;       /*   访问根结点   */
  InorderTraverse(T->Rchild) ;
 }
}  


2  非递归算法
设T是指向二叉树根结点的指针变量,非递归算法是:
若二叉树为空,则返回;否则,令p=T
⑴ 若p不为空,p进栈, p=p->Lchild ;
⑵ 否则(即p为空),退栈到p,访问p所指向的结点;
⑶ p=p->Rchild ,转(1);
直到栈空为止。
算法实现:

#define MAX_NODE  50
void  InorderTraverse( BTNode  *T)

 BTNode  *Stack[MAX_NODE] ,*p=T ;
 int  top=0 , bool=1 ;
 if(T==NULL)  printf(“ Binary Tree is Empty!\n”) ;
 else 
 {
  do
  {
   while (p!=NULL)
   { 
    stack[++top]=p ; 
    p=p->Lchild ;  
   }
   if (top==0) 
   {
    bool=0 ;
   }
   else 
   { 
    p=stack[top] ; 
    top-- ;
    visit( p->data ) ; 
    p=p->Rchild ;
   }
  } while (bool!=0) ;
 }
}
/*################# InorderTraverse end   ###################################################################*/

 

/*################# PostorderTraverse begin ###################################################################*/

后续遍历:

设T是指向根结点的指针变量,非递归算法是:
若二叉树为空,则返回;否则,令p=T;
⑴ 第一次经过根结点p,不访问:
p进栈S1 , tag 赋值0,进栈S2,p=p->Lchild 。
⑵ 若p不为空,转(1),否则,取状态标志值tag :
⑶ 若tag=0:对栈S1,不访问,不出栈;修改S2栈顶元素值(tag赋值1) ,取S1栈顶元素的右子树,即p=S1[top]->Rchild ,转(1);
⑷ 若tag=1:S1退栈,访问该结点;
直到栈空为止。

算法实现:
#define MAX_NODE  50
void  PostorderTraverse( BTNode  *T)

 BTNode  *S1[MAX_NODE] ,*p=T ;
 int S2[MAX_NODE] , top=0 , bool=1 ;
 if  (T==NULL) 
 {
  printf(“Binary Tree is Empty!\n”) ;
 }
 else 
 {
  do
  {  
   while (p!=NULL)
   {
    S1[++top]=p ; S2[top]=0 ;
    p=p->Lchild ;  
   }
   if  (top==0)
   {
    bool=0 ;
   }
   else if(S2[top]==0)
   {
    p=S1[top]->Rchild ;  S2[top]=1 ; 
   }
   else
   {
    p=S1[top] ;  top-- ;
    visit( p->data ) ; p=NULL ;
    /*  使循环继续进行而不至于死循环 */                     
   }
  }  while (bool!=0) ;
 }
}
/*################# PostorderTraverse end   ###################################################################*/

 

原创粉丝点击