对于二叉树T,可以递归定义它的前序遍历,中序遍历,后序遍历,只要深搜理解了,三种遍历都不是事
前序:PreOrder(T)=T的根节点+PreOrder(T的左子树)+PreOrder(T的右子树);
中序:PreOrder(T)=PreOrder(T的左子树)+T的根节点+PreOrder(T的右子树);
后序:PreOrder(T)=PreOrder(T的左子树)+PreOrder(T的右子树)+T的根节点;
放上代码感受一下,咳咳,为了检验大家深搜到底有没有 理解,我并不给输入说明,大家看CreateBiTree()函数自己创建一棵二叉树,我还是那句话,只要深搜理解透彻,你不用三分钟就可以搞定三种遍历
1 2 0 0 3 0 0(输入)
1 2 3
2 1 3
2 3 1
呃呃,还是给大家一组输入吧
#include <stdio.h>
//节点声明,数据域、左指针、右指针
typedef struct BiTNode
{
int data;
struct BiTNode *Left,*Right;
}BiTNode,*BiTree;
BiTree CreateBiTree();
void PreOrderTraverse(BiTree T);
void InOrderTraverse(BiTree T);
void PostOrderTraverse(BiTree T);
int main()
{
BiTree T;
T = CreateBiTree();//建立
PreOrderTraverse(T);//
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
printf("\n");
return 0;
}
//先序建立二叉树
BiTree CreateBiTree()
{
int a;
BiTree T;
scanf("%d",&a);
if(a==0)
T=NULL;
else
{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = a;
T->Left = CreateBiTree();
T->Right = CreateBiTree();
}
return T;//返回根节点
}
//先序遍历二叉树
void PreOrderTraverse(BiTree T)
{
if(T)
{
printf("%d ",T->data);
PreOrderTraverse(T->Left);
PreOrderTraverse(T->Right);
}
return;
}
//中序遍历
void InOrderTraverse(BiTree T)
{
if(T)
{
PreOrderTraverse(T->Left);
printf("%d ",T->data);
PreOrderTraverse(T->Right);
}
}
//后序遍历
void PostOrderTraverse(BiTree T)
{
if(T)
{
PreOrderTraverse(T->Left);
PreOrderTraverse(T->Right);
printf("%d ",T->data);
}
}