C语言实现以下二叉树
前序遍历:先输出根节点,在遍历左子树,最后右子树(根、左、右)
中序遍历:先遍历左子树,在输出根节点,最后右子树(左、根、右)
后序遍历:先遍历左子树,在遍历右子树,最后根节点(左、右、根)
代码如下(示例) :
// 二叉树.cpp
#include <stdio.h>
#include <stdlib.h>
//定义数据类型
typedef char DataType;
//定义二叉树
typedef struct bittree {
DataType data;
struct bittree* lchild, * rchild; //左右子树节点指针
}BinTree;
//--------------函数声明---------------
BinTree* CreateBinTree(BinTree* T); //前序创建二叉树
void preOrder(BinTree* T); //前序遍历
void InOrder(BinTree* T); //中序遍历
void PostOrder(BinTree* T); //后序遍历
//-------------------------------------
int main()
{
BinTree* T = (BinTree*)malloc(sizeof(BinTree)); //创建二叉树
T = CreateBinTree(T); //接受返回的根结点地址
printf("前序遍历:");
preOrder(T); //前序遍历
printf("\n"); //换行
printf("中序遍历:");
InOrder(T); //中序遍历
printf("\n"); //换行
printf("后序遍历:");
PostOrder(T); //后序遍历
printf("\n"); //换行
return 0;
}
//先序创建二叉树
BinTree* CreateBinTree(BinTree *T) {
char data;
printf("请输入当前节点数据:data = ");
scanf_s("%c", &data,1);
getchar(); //用来接收缓冲区内的“回车"
if (data == '#') {
T = NULL; //判断:如果输入的字符串是“#”,将指向孩子节点的指针置空
}
else {
T = (BinTree*)malloc(sizeof(BinTree)); //malloc动态分配内存
if ( T == NULL ) {
printf("分配空间失败\n");
return 0;
}
T->data = data;
T->lchild = CreateBinTree(T->lchild); //接收左孩子节点地址,存放进 T->lchild 左指针内
T->rchild = CreateBinTree(T->rchild); //接收右孩子节点地址,存放进 T->rchild 右指针内
}
return T;
}
//前序遍历二叉树
void preOrder(BinTree* T) {
if (T)
{
printf("%c ", T->data); //输出根节点数据
preOrder(T->lchild); //遍历左子树
preOrder(T->rchild); //遍历右子树
}
}
//中序遍历二叉树
void InOrder(BinTree* T) {
if (T) {
InOrder(T->lchild ); //遍历左子树
printf("%c ", T->data); //输出根节点数据
InOrder(T->rchild ); //遍历右子树
}
}
//后序遍历
void PostOrder(BinTree* T) {
if (T) {
PostOrder(T->lchild); //遍历左子树
PostOrder(T->rchild); //遍历右子树
printf("%c ", T->data); //输出根节点数据
}
}
输入:AB#DG###CE#H##F##
输出: