/*################# 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 ###################################################################*/