二叉树的遍历方法分三种:前序,中序和后序。
前序遍历:根,左子树,右子树;
中序遍历:左子树,根,右子树;
后序遍历:左子树,右子树,根;
void PreOrder(BtNode *ptr)
{
if(ptr != NULL)
{
printf("%c ",ptr->data);
PreOrder(ptr->leftchild);
PreOrder(ptr->rightchild);
}
}
void InOrder(BtNode *ptr)
{
if(ptr != NULL)
{
InOrder(ptr->leftchild);
printf("%c ",ptr->data);
InOrder(ptr->rightchild);
}
}
void PastOrder(BtNode *ptr)
{
if(ptr != NULL)
{
PastOrder(ptr->leftchild);
PastOrder(ptr->rightchild);
printf("%c ",ptr->data);
}
}
二叉树的非递归调用主要是利用栈先进后出的特点遍历整个树,将需要打印的结点在栈内进行出栈和入栈操作。
void NicePreOrder(BtNode *ptr)
{
if(ptr == NULL) return ;
Init_Stack(&st);
push(&st,ptr);
while(!empty(&st))
{
ptr = top(&st); pop(&st);
printf("%c ",ptr->data);
if(ptr->rightchild != NULL)
push(&st,ptr->rightchild);
if(ptr->leftchild != NULL)
push(&st,ptr->leftchild);
}
}
void NiceInOrder(BtNode *ptr)
{
if(ptr == NULL) return ;
Stack st;
Init_Stack(&st);
while(ptr != NULL || !empty(&st))
{
while(ptr != NULL)
{
push(&st,ptr);
ptr = ptr->leftchild;
}
ptr = top(&st); pop(&st);
printf("%c ",ptr->data);
ptr = ptr->rightchild;
}
}
void NicePastOrder(BtNode *ptr)
{
if(ptr == NULL) return ;
Stack st;
Init_Stack(&st);
BtNode *tag = NULL;
while(ptr != NULL || !empty(&st))
{
while(ptr != NULL)
{
push(&st,ptr);
ptr = ptr->leftchild;
}
ptr = top(&st); pop(&st);
if(ptr->rightchild == NULL || ptr->rightchild == tag)
{
printf("%c ",ptr->data);
tag = ptr;
ptr = NULL;
}
else
{
push(&st,ptr);
ptr = ptr->rightchild;
}
}
}
二叉树的遍历主要考虑,左子树,根节点,右子树三者之间的联系,并且保证他们出栈的顺序及规律。