//递归实现二叉树的遍历;
//通俗来讲:
先序遍历:就是第一次遇到结点的顺序记录;
中序遍历:就是第二次遇到结点的记录;
后序遍历:就是第三次遇到结点的记录;
#include<stdio.h>
#include<stdlib.h>
typedef struct tree
{
char ch;
struct tree *lchild;
struct tree *rchild;
}BitTree;
BitTree *CreateTree() //创建树;
{
BitTree *bt;
char str;
scanf("%c",&str);
if(str=='#')
return NULL;
else
{
bt=(BitTree *)malloc(sizeof(BitTree));
bt->ch=str;
bt->lchild=CreateTree();
bt->rchild=CreateTree();
return bt;
}
}
//先序遍历二叉树,递归实现;
void PreOrder(BitTree *bt)
{
if(bt)
{
printf(" %c ",bt->ch); //第一次遇到就输出;
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
//中序遍历二叉树,递归实现;
void InOrder(BitTree *bt)
{
if(bt)
{
InOrder(bt->lchild);
printf(" %c ",bt->ch); //第二次遇到就输出;
InOrder(bt->rchild);
}
}
//后序遍历二叉树,递归实现;
void PostOrder(BitTree *bt)
{
if(bt)
{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
printf(" %c ",bt->ch); //第三次遇到就输出;
}
}
//释放树的结点;
void DestroyTree(BitTree *bt)
{
if(bt)
{
DestroyTree(bt->lchild);
DestroyTree(bt->rchild);
free(bt);
}
}
int main(void)
{
BitTree *bt;
printf("请以先序输入二叉树(#表示该结点的子结点为空):\n");
bt=CreateTree();
printf("\n递归先序的结果:\n");
PreOrder(bt);
printf("\n递归中序的结果:\n");
InOrder(bt);
printf("\n递归后序的结果:\n");
PostOrder(bt);
printf("\n");
DestroyTree(bt); //释放树结点;
return 0;
}
//以AB##C#D##为例: