以先序方式创建一颗二叉树:
创建一棵图形如下的二叉树
// 示例二叉树
a
/ \
b c
\ \
d e
/
f
代码示例:
/* 遍历二叉树 【先序、中序、后序、层次遍历】*/
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结构体
typedef struct Bnode {
char data;
struct Bnode *lchild;
struct Bnode *rchild;
} Bnode,*Btree;
// 创建二叉树(按先序顺序输入二叉树)
Btree Creat(Btree T) {
//手动输入的二叉树按先序顺序输入
char ch;
printf("Enter the data of node:");
scanf(" %c",&ch);
if(ch != '#') { // 输入#表示结点为空
T = (Btree)malloc(sizeof(Bnode));
T->data = ch;
T->lchild = NULL;
T->rchild = NULL;
T->lchild = Creat(T->lchild);
T->rchild = Creat(T->rchild);
}
return T;
}
// 先序
void PreOrder(Btree T) {
if(T==NULL)
return;
printf("%c ",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
// 中序
void InOrder(Btree T) {
if(T==NULL)
return;
InOrder(T->lchild);
printf("%c ",T->data);
InOrder(T->rchild);
}
// 后序
void PostOrder(Btree T) {
if(T==NULL)
return;
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c ",T->data);
}
//层序
void LevelOrder(Btree T) {
if(T==NULL)
return;
int front = -1,rear = -1;
Btree p;
Btree Queue[30]; // 定义一个队列,大小暂时取30
Queue[++rear] = T; // 根节点入队
while(front<rear) { // 队列不为空
p = Queue[++front]; // 队首元素出队
printf("%c ",p->data); // 打印结点元素
if(p->lchild!=NULL) // 左孩子不为空则入队
Queue[++rear] = p->lchild;
if(p->rchild!=NULL) // 右孩子不为空则入队
Queue[++rear] = p->rchild;
}
}
//销毁二叉树
void Destroy(Btree T) {
if(T==NULL)
return;
else if(T->lchild==NULL&&T->rchild==NULL) {
free(T);
return;
} else {
Destroy(T->lchild);
Destroy(T->rchild);
}
}
void main() {
Btree T = NULL; // 定义二叉树头结点
T = Creat(T); // 生成二叉树
if(!T)
return;
printf("\n先序序列:");
PreOrder(T);
printf("\n中序序列:");
InOrder(T);
printf("\n后序序列:");
PostOrder(T);
printf("\n层次遍历:");
LevelOrder(T);
printf("\n");
Destroy(T);
printf("\n二叉树已销毁!\n");
}
结果示例: