头文件 btree.h
#ifndef _BTREE_H_
#define _BTREE_H_
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef char datatype_bt;
typedef struct btreenode{
datatype_bt data; //结点数据域
struct btreenode *lchild,*rchild;//左右孩子指针
}btree_node,*btree_pnode;
btree_pnode create_btree1(); //创建一个二叉树并返回、方法一
void create_btree2(btree_pnode *T); //创建一个二叉树, 方法二
void pre_order(btree_pnode t); //先序遍历递归算法实现 根左右
void mid_order(btree_pnode t); //中序遍历递归算法实现 左根右
void post_order(btree_pnode t); //后序遍历递归算法实现 左右根
btree_pnode create_btree1() //创建一个二叉树并返回
{
datatype_bt ch;
btree_pnode T;
scanf("%c",&ch);
if('#'==ch)
return NULL;
else
{
//创建根结点
T=(btree_pnode)malloc(sizeof(btree_node));
if(T==NULL)
{
perror("malloc failed");
exit(1);
}
T->data=ch;
//用相同的方法创建左子树
T->lchild=create_btree1();
//用相同的方法创建右子树
T->rchild=create_btree1();
}
}
void create_btree2(btree_pnode *T) //创建一个二叉树, 方法二
{
datatype_bt ch;
scanf("%c",&ch);
if('#'==ch)
*T=NULL;
else
{
//创建根结点
*T=(btree_pnode)malloc(sizeof(btree_node));
if(*T==NULL)
{
perror("malloc failed");
exit(1);
}
(*T)->data=ch;
//用相同的方法创建左子树
create_btree2(&(*T)->lchild);
//用相同的方法创建右子树
create_btree2(&(*T)->rchild);
}
}
void pre_order(btree_pnode t) //先序遍历递归算法实现 根左右
{
if(t!=NULL)
{
//访问根结点
printf("%c ",t->data);
//先序遍历左子树
pre_order(t->lchild);
//先序遍历右子树
pre_order(t->rchild);
}
}
void mid_order(btree_pnode t) //中序遍历递归算法实现 左根右
{
if(t!=NULL)
{
//中序遍历左子树
mid_order(t->lchild);
//访问根结点
printf("%c ",t->data);
//中序遍历右子树
mid_order(t->rchild);
}
}
void post_order(btree_pnode t) //后序遍历递归算法实现 左右根
{
if(t!=NULL)
{
//后序遍历左子树
post_order(t->lchild);
//后序遍历右子树
post_order(t->rchild);
//访问根结点
printf("%c ",t->data);
}
}
#endif
测试文件 btree.c
/*
输入的树为:AB#CD###E#FGH##K###
先序遍历结果:A B C D E F G H K
中序遍历结果: B D C A E H G K F
后序遍历结果:D C B H K G F E A
*/
#include "btree.h"
int main()
{
btree_pnode t;
//创建一个二叉树
printf("下面开始创建一个二叉树:\n");
create_btree2(&t);
//先序遍历
printf("先序遍历的结果是:\n");
pre_order(t);
printf("\n");
//中序遍历
printf("中序遍历结果是:\n");
mid_order(t);
printf("\n");
//后序遍历
printf("后序遍历结果是:\n");
post_order(t);
printf("\n");
return 0;
}