一、引言
二叉树的遍历常见的方法有先序遍历、中序遍历、后序遍历和层次遍历等,本文给出了C语言版本的先序遍历二叉树的非递归算法和递归算法。
先序遍历的原理很简单,访问结点的次序是:“根—>左—>右”,也就是首先访问树根,之后访问左子树,最后访问右子树。对于左、右子树而言,其访问的次序依然是“根—>左—>右”。也就是说,对于每一棵子树,首先访问树根,再言其它。
从上面描述可以看出遍历过程其实是递归的过程,因此可以使用递归算法来实现,但是同样也可以使用非递归的方法来实现。
二、二叉树的先序遍历详细演示过程
1、假设二叉树(左右子树全)如下图所示:
2、假设二叉树(没有右子树)如下图所示:
3、假设二叉树(没有左子树)如下图所示:
4、对于稍微复杂一点的二叉树,如下图所示:
其先序遍历过程演示如下(“根—>左—>右”)
三、先序遍历二叉树的代码:
1、递归算法
void PreorderSearch_Recu( BiTree *T )
{
if( T != NULL )
{
VisitNode( T->data ); //访问根结点
PreorderSearch_Recu( T->Lchild ) ; //访问左子树
PreorderSearch_Recu( T->Rchild ) ; //访问右子树
}
}
2、非递归算法
void PreorderSearch( BiTree *T )
{
BiTree *Stack[MAX_NODE] , *p, *q;
int top=0 ;
p = T;
if( T==NULL )
{
printf( "Binary Tree is Empty!\n");
return;
}
while( p != NULL )
{
VisitNode( p->data );
q = p->Rchild;
if( NULL != q )
Stack[++top] = q;
p = p->Lchild;
if( p == NULL && top > 0 )
p = Stack[top--];
}
}
3、VisitNode函数如下:
void VisitNode( datatype data )
{
#ifdef CHAR
printf( "%5c", data );
#else
printf( "%5d", data );
#endif
}
补充:结合前面文章中的创建二叉树的算法,就可以完整的二叉树创建与遍历工作了。此处不再赘叙创建的算法。