添加链接描述
运行了一下博客中的代码 亲测实用.没有改动
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef char EleType;
typedef struct BiTNode{
EleType data;//结点的数据域
struct BiTNode *lchild,*rchild;//左右孩子的指针域
}BiTNode,*BiTree;
//约定前序遍历创建结点
//每个结点都有左右孩子,孩子不存在的为NULL
void CreateBiTree(BiTree *tree){
char c;
scanf("%c",&c);
if(' '==c){//输入空格代表孩子不存在
*tree=NULL;
}else{
*tree=(BiTNode *)malloc(sizeof(BiTNode));//为结点添加内存
(*tree)->data=c;//把C赋值给data
//这里运用了递归的思想,选择一边不断的递归下去
CreateBiTree(&(*tree)->lchild);//创建左子树
CreateBiTree(&(*tree)->rchild);//创建右子树
}
}
void visit(EleType data,int level){//这是输出中间结点
printf("%c第%d层\n",data,level);
return ;
}
//前序遍历
void PreOrderTraverse(BiTree tree,int level){
if(NULL!=tree){
visit(tree->data,level);
//递归思想的引用,层层遍历
PreOrderTraverse(tree->lchild,level+1);
PreOrderTraverse(tree->rchild,level+1);
}
}
//中序遍历
void MidOrderTraverse(BiTree tree,int level){
if(NULL!=tree){
MidOrderTraverse(tree->lchild,level+1);
visit(tree->data,level);
PreOrderTraverse(tree->rchild,level+1);
}
}
void PostOrderTraverse(BiTree tree,int level){
if(NULL!=tree){
MidOrderTraverse(tree->lchild,level+1);
PreOrderTraverse(tree->rchild,level+1);
visit(tree->data,level);
}
}
int main(int argc,char *argv[]){
BiTree tree=NULL;
printf("请按前序遍历的方式输入结点的数据,没有结点不存在请使用空格代替");
CreateBiTree(&tree);
printf("前序遍历:\n");
PreOrderTraverse(tree,1);
printf("中序遍历:\n");
MidOrderTraverse(tree,1);
printf("后序遍历:\n");
PostOrderTraverse(tree,1);
return 0;
}
运行结果:
前序遍历:
A第1层
B第2层
C第3层
D第3层
E第2层
G第3层
中序遍历:
C第3层
B第2层
D第3层
A第1层
E第2层
G第3层
后序遍历:
C第3层
B第2层
D第3层
E第2层
G第3层
A第1层
输入的时候需要注意一些事项:在创建二叉链表时,我们约定空格个位NULL孩子结点,我们以前序遍历的形式创建二叉链表输入应该是:ABC D E G 也就是ABC2个空格D2个空格E1个空格G2个空格换行