您的位置:首页 > 编程语言 > C语言/C++

C语言:二叉树的三种遍历方式

2017-08-27 15:12 381 查看
二叉树如下:



遍历后的结果应该是:

先序遍历:ABDEFCGHI

中序遍历:EDFBACHGI

后序遍历:EFDBHIGCA

#include <stdio.h>
#include <stdbool.h>
typedef char ElemType;
typedef struct BTNode{
ElemType data;//数据域
struct BTNode *pLChild;//左子树地址
struct BTNode *pRChild;//右子树地址
}BTNODE, * PBTNODE;

PBTNODE creatBTree();
void preTranverseBTree(PBTNODE);
void inTranverseBTree(PBTNODE);
void postTranverseBTree(PBTNODE);
int main(void){
PBTNODE pRoot = creatBTree();
printf("先序遍历:");
preTranverseBTree(pRoot);//先序遍历:ABDEFCGHI
printf("\n");
printf("中序遍历:");
inTranverseBTree(pRoot);//中序遍历:EDFBACHGI
printf("\n");
printf("后序遍历:");
postTranverseBTree(pRoot);//后序遍历:EFDBHIGCA
printf("\n");
return 0;
}
PBTNODE creatBTree(){
PBTNODE pA = (PBTNODE)malloc(sizeof(BTNODE));//A
PBTNODE pB = (PBTNODE)malloc(sizeof(BTNODE));//B
PBTNODE pC = (PBTNODE)malloc(sizeof(BTNODE));//C
PBTNODE pD = (PBTNODE)malloc(sizeof(BTNODE));//D
PBTNODE pE = (PBTNODE)malloc(sizeof(BTNODE));//E
PBTNODE pF = (PBTNODE)malloc(sizeof(BTNODE));//F
PBTNODE pG = (PBTNODE)malloc(sizeof(BTNODE));//G
PBTNODE pH = (PBTNODE)malloc(sizeof(BTNODE));//H
PBTNODE pI = (PBTNODE)malloc(sizeof(BTNODE));//I

pA->data = 'A';
pB->data = 'B';
pC->data = 'C';
pD->data = 'D';
pE->data = 'E';
pF->data = 'F';
pG->data = 'G';
pH->data = 'H';
pI->data = 'I';

pA->pLChild = pB;
pA->pRChild = pC;

pB->pLChild = pD;
pB->pRChild = NULL;

pC->pLChild = NULL;
pC->pRChild = pG;

pD->pLChild = pE;
pD->pRChild = pF;

pE->pLChild = NULL;
pE->pRChild = NULL;

pF->pLChild = NULL;
pF->pRChild = NULL;

pG->pLChild = pH;
pG->pRChild = pI;

pH->pLChild = NULL;
pH->pRChild = NULL;

pI->pLChild = NULL;
pI->pRChild = NULL;
return pA;
}
bool hasLeftChild(PBTNODE pBTNode){
return pBTNode->pLChild != NULL;
}
bool hasRightChild(PBTNODE pBTNode){
return pBTNode->pRChild != NULL;
}
bool isNotLeafNode(PBTNODE pBTNode){
return hasLeftChild(pBTNode) || hasRightChild(pBTNode);
}
//先序遍历:ABDEFCGHI
void preTranverseBTree(PBTNODE pRoot){
//根节点,左子树,右子树
printf("%c ", pRoot->data);
if (hasLeftChild(pRoot)){
preTranverseBTree(pRoot->pLChild);
}
if (hasRightChild(pRoot)){
preTranverseBTree(pRoot->pRChild);
}
}
//中序遍历:EDFBACHGI
void inTranverseBTree(PBTNODE pRoot){
//左子树,根节点,右子树
if (hasLeftChild(pRoot)){
inTranverseBTree(pRoot->pLChild);
}
printf("%c ", pRoot->data);
if (hasRightChild(pRoot)){
inTranverseBTree(pRoot->pRChild);
}
}
//后序遍历:EFDBHIGCA
void postTranverseBTree(PBTNODE pRoot){
//左子树,右子树,根节点
if (hasLeftChild(pRoot)){
postTranverseBTree(pRoot->pLChild);
}
if (hasRightChild(pRoot)){
postTranverseBTree(pRoot->pRChild);
}
printf("%c ", pRoot->data);
}

遍历结果为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: