先序遍历二叉树
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) ;
}
}
中序遍历二叉树
1 递归算法
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) ;
}
}
后序遍历二叉树
1 递归算法
void PostorderTraverse(BTNode *T)
{
if (T!=NULL)
{
PostorderTraverse(T->Lchild) ;
PostorderTraverse(T->Rchild) ;
visit(T->data) ; /* 访问根结点 */
}
}