关于理论,可以去其他地方翻一下,我这儿就不总结了。
话不多说,用下面的例子体会三种遍历方式访问的顺序:
先序遍历(根结点 > 左子树 > 右子树)的访问结果:++a*bc*+*defg
中序遍历(左子树 > 根结点 > 右子树)的访问结果:a+b*c+d*e+f*g
后序遍历(左子树 > 右子树 > 根结点)的访问结果:abc*+de*f+g*+
程序:
# include<stdio.h>
# include<stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode* Leftchild, * Rightchild;
} BiTNode, * BiTree;
/*按先序的规则输入、创建一个二叉树链表*/
void CreatBiTree(BiTree* T)
{
char ch;
if ((ch = getchar()) == ' ')
*T = NULL;
else
{
*T = (BiTNode*)malloc(sizeof(BiTNode));
if (!(*T))
exit(1);
(*T)->data = ch;
CreatBiTree(&(*T)->Leftchild);
CreatBiTree(&(*T)->Rightchild);
}
}
/*
先序遍历
*/
void PreOrderTraverse(BiTree T)
{
if (T)
{
printf("%c", T->data);
PreOrderTraverse(T->Leftchild);
PreOrderTraverse(T->Rightchild);
}
}
/*
中序遍历
*/
void InOrderTraverse(BiTree T)
{
if (T)
{
InOrderTraverse(T->Leftchild);
printf("%c", T->data);
InOrderTraverse(T->Rightchild);
}
}
/*
后序遍历
*/
void PostOrderTraverse(BiTree T)
{
if (T)
{
PostOrderTraverse(T->Leftchild);
PostOrderTraverse(T->Rightchild);
printf("%c", T->data);
}
}
void main()
{
BiTree T;
printf("请按先序输入所有结点的值(无左/右子树输入空格):\n");
CreatBiTree(&T);
printf("\n");
printf("先序遍历结果:\n");
PreOrderTraverse(T);
printf("\n");
printf("中序遍历结果:\n");
InOrderTraverse(T);
printf("\n");
printf("后序遍历结果:\n");
PostOrderTraverse(T);
printf("\n");
getchar();
}
运行:
请按先序输入所有结点的值(无左/右子树输入空格):
++a *b c *+*d e f g
先序遍历结果:
++a*bc*+*defg
中序遍历结果:
a+b*c+d*e+f*g
后序遍历结果:
abc*+de*f+g*+
E:\Visual C++\basic\tree\Debug\tree.exe (进程 18508)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .