typedef struct BTNode
{
char data;//存放节点
struct BTNode * pLchild;//左子树
struct BTNode * pRchild;//右子树
}BTNODE, * PBTNODE;
PBTNODE CreateBTree(void);//创建二叉树
void PreTraverseBTree(struct BTNode * pT);//先序遍历
void InTraverseBTree(struct BTNode * pT);//中序遍历
void PostTraverseBTree(struct BTNode * pT);//后序遍历
int main(void)
{
PBTNODE pBT;
pBT = CreateBTree();//返回二叉树的地址并赋给pBT;
PreTraverseBTree(pBT);//先序遍历
printf("\n");
InTraverseBTree(pBT);//中序遍历
printf("\n");
PostTraverseBTree(pBT);//后序遍历
printf("\n");
return 0;
}
//创建二叉树
PBTNODE CreateBTree(void)
{
//创建单个子树
PBTNODE pA = (PBTNODE)malloc(sizeof(BTNODE));
PBTNODE pB = (PBTNODE)malloc(sizeof(BTNODE));
PBTNODE pC = (PBTNODE)malloc(sizeof(BTNODE));
PBTNODE pD = (PBTNODE)malloc(sizeof(BTNODE));
PBTNODE pE = (PBTNODE)malloc(sizeof(BTNODE));
PBTNODE pF = (PBTNODE)malloc(sizeof(BTNODE));
//二叉树节点初始化
pA->data = ‘A‘;
pB->data = ‘B‘;
pC->data = ‘C‘;
pD->data = ‘D‘;
pE->data = ‘E‘;
pF->data = ‘F‘;
//关联各个子树,确定各个子树之间的关系
pA->pLchild = pB;
pA->pRchild = pC;
pB->pLchild = pD;
pB->pRchild = pE;
pC->pLchild = pF;
pC->pRchild = NULL;
pD->pLchild = NULL;
pD->pRchild = NULL;
pE->pLchild = NULL;
pE->pRchild = NULL;
pF->pLchild = NULL;
pF->pRchild = NULL;
return pA;//返回二叉树的地址
}
//先序遍历,先访问根节点,再先序访问左子树,再先序右子树
//用if判断根节点下面是否为空,减少运算量,
void PreTraverseBTree(struct BTNode * pT)
{
if( NULL != pT)
{
printf("%c; ", pT->data);
if(NULL != pT->pLchild)
{
PreTraverseBTree(pT->pLchild);
}
if(NULL != pT->pRchild)
{
PreTraverseBTree(pT->pRchild);
}
}
return ;
}
//中序遍历,先序访问左子树,再访问根节点,再先序右子树
void InTraverseBTree(struct BTNode * pT)
{
if( NULL != pT)
{
if(NULL != pT->pLchild)
{
InTraverseBTree(pT->pLchild);
}
printf("%c; ", pT->data);
if(NULL != pT->pRchild)
{
InTraverseBTree(pT->pRchild);
}
}
return ;
}
//后序遍历.先序左子树,再先序右子树,再访问根节点
void PostTraverseBTree(struct BTNode * pT)
{
if( NULL != pT)
{
if(NULL != pT->pLchild)
{
PostTraverseBTree(pT->pLchild);
}
if(NULL != pT->pRchild)
{
PostTraverseBTree(pT->pRchild);
}
printf("%c; ", pT->data);
}
return ;
}
原文:https://www.cnblogs.com/jtpw/p/13574350.html