//
// main.c
// testBinaryTree
//
// Created by lan on 16/3/15.
// Copyright © 2016年 lan. All rights reserved.
//
#include <stdio.h>
#include <malloc/malloc.h>
#include <stdlib.h>
typedef struct BTNode {
char data;
struct BTNode * pLchild; // 左孩子
struct BTNode * pRchild; // 右孩子
}BTNODE, * PBTNODE;
PBTNODE CreateBTree(); // 创建二叉树
void PreTraverseBTree(PBTNODE); // 先序输出
void InTraverseBTree(PBTNODE); // 中序输出
void PostTraverseBTree(PBTNODE); // 后序输出
int main(int argc, const char * argv[]) {
PBTNODE pT = CreateBTree();
// 因为计算机存储数据是线性的,需要按照某种顺序输出
printf("先序输出: ");
PreTraverseBTree(pT);
printf("\n中序输出: ");
InTraverseBTree(pT);
printf("\n后序输出: ");
PostTraverseBTree(pT);
printf("\n");
return 0;
}
void PreTraverseBTree(PBTNODE pT) {
// 主要代码只有三句
// 先序、中序、后序只是变换了顺序
// printf("%c ", pT->data);
// PreTraverseBTree(pT->pLchild);
// PreTraverseBTree(pT->pRchild);
if (pT != NULL) {
printf("%c ", pT->data);
if (NULL != pT->pLchild) {
PreTraverseBTree(pT->pLchild);
}
if (NULL != pT->pRchild) {
PreTraverseBTree(pT->pRchild);
}
}
}
void InTraverseBTree(PBTNODE pT) {
if (pT != NULL) {
if (NULL != pT->pLchild) {
InTraverseBTree(pT->pLchild);
}
printf("%c ", pT->data);
if (NULL != pT->pRchild) {
InTraverseBTree(pT->pRchild);
}
}
}
void PostTraverseBTree(PBTNODE pT) {
if (pT != NULL) {
if (NULL != pT->pLchild) {
PostTraverseBTree(pT->pLchild);
}
if (NULL != pT->pRchild) {
PostTraverseBTree(pT->pRchild);
}
printf("%c ", pT->data);
}
}
PBTNODE CreateBTree() {
// 静态生成二叉树
/*
A
/ \
B C
/
D
\
E
先序遍历:根节点->左子树->右子树
中序遍历:左子树->根节点->右子树
后序遍历:左子树->右子树->根节点
先中后其实是 跟节点 所在的次序
*/
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));
pA->data = 'A';
pB->data = 'B';
pC->data = 'C';
pD->data = 'D';
pE->data = 'E';
pA->pLchild = pB;
pA->pRchild = pC;
pB->pLchild = pB->pRchild = NULL; // 不要忘了为 NULL 也要写
pC->pLchild = pD;
pC->pRchild = NULL;
pD->pLchild = NULL;
pD->pRchild = pE;
pE->pLchild = pE->pRchild = NULL;
return pA; // 返回根节点
}
输出结果:
先序输出: A B C D E
中序输出: B A D E C
后序输出: B E D C A
Program ended with exit code: 0