二叉树的单个结构就是中间是数据域两边分别对应着左子树的指针和右子树的指针;因此先定义二叉树的结构体:
typedef struct tree{
int data; //数据域
struct tree *lchild;
struct tree *rchild;
//左右子树的指针
}tree,*linktree;
二叉树的创建:
linktree creat(){//创建
int data;
linktree t;
scanf("%d",&data);
if (data ==-1)//输入-1就代表着没有子树
return NULL;
else{
t=(linktree)malloc(sizeof(tree));
t->data=data;
printf("这个%d树的左子树是:",data);
t->lchild=creat();//利用递归
printf("这个%d树的右子树是:",data);
t->rchild=creat();
return t;
}
}
前序遍历(根,左,右):
void xian(linktree t){
if (t==NULL)
return ;
else{
printf("%d\t",t->data);
xian(t->lchild);
xian(t->rchild);
}
}
中序遍历(左,根,右):
void zhong(linktree t){
if (t==NULL)
{
return ;
}
else
{
zhong(t->lchild);
printf("%d\t",t->data);
zhong(t->rchild);
}
}
后序遍历(左 ,右,根 )
void hou(linktree t){
if (t ==NULL)
{
return;
}
else{
hou(t->lchild);
hou(t->rchild);
printf("%d\t",t->data);
}
}
层序遍历啊(按照层次,要利用到队列):
void cen(linktree t){
linktree a[100],p;
int front,rear;//创建队列的指针
if (t==NULL)
{
return ;
}
else{
a[0]=t;
front=-1;
rear=0;
while(front!=rear){//当对队列不是空就执行循环
printf("%d\t",a[++front]->data);
p=a[front];//p是当前树的指针
if (p->lchild!=NULL)
{
a[++rear]=p->lchild;
}
if (p->rchild!=NULL)
{
a[++rear]=p->rchild;
}
}
}
}
总的代码:
#include <stdio.h>
#include<stdlib.h>
typedef struct tree{
int data; //数据域
struct tree *lchild;
struct tree *rchild;
//左右子树的指针
}tree,*linktree;
linktree creat(){//创建
int data;
linktree t;
scanf("%d",&data);
if (data ==-1)//输入-1就代表着没有子树
return NULL;
else{
t=(linktree)malloc(sizeof(tree));
t->data=data;
printf("这个%d树的左子树是:",data);
t->lchild=creat();//利用递归
printf("这个%d树的右子树是:",data);
t->rchild=creat();
return t;
}
}
void xian(linktree t){
if (t==NULL)
return ;
else{
printf("%d\t",t->data);
xian(t->lchild);
xian(t->rchild);
}
}
void zhong(linktree t){
if (t==NULL)
{
return ;
}
else
{
zhong(t->lchild);
printf("%d\t",t->data);
zhong(t->rchild);
}
}
void hou(linktree t){
if (t ==NULL)
{
return;
}
else{
hou(t->lchild);
hou(t->rchild);
printf("%d\t",t->data);
}
}
void cen(linktree t){
linktree a[100],p;
int front,rear;//创建队列的指针
if (t==NULL)
{
return ;
}
else{
a[0]=t;
front=-1;
rear=0;
while(front!=rear){//当对队列不是空就执行循环
printf("%d\t",a[++front]->data);
p=a[front];//p是当前树的指针
if (p->lchild!=NULL)
{
a[++rear]=p->lchild;
}
if (p->rchild!=NULL)
{
a[++rear]=p->rchild;
}
}
}
}
int main(){
linktree t;
printf("先输入根:");
t=creat();
printf("先序:");
xian(t);
printf("中序:");
zhong(t);
printf("后序:");
hou(t);
printf("层序:");
cen(t);
}
代码测试: