先序中序后序建立二叉树都并不难,但是层序反而需要动点脑子,例如对于二叉树:
这样一棵二叉树的层序遍历结果是:
1-2-3-4-null-5-null-6-7-null-8
而利用以上的层序遍历结果作为输入,先序输出为:
1-2-4-6-7-3-5-8(忽略了null)
这种层序遍历输入创建二叉树最开始是在某位博主的文章里学到的(忘了具体是哪位,55…),他的代码的一些指针啊数组啊就没有变动了,但这个博客主要是为了学习,所以事先在此声明一下,侵删。
层序遍历先序输出源代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *lchild;
struct node *rchild;
}BinTree;
//函数声明
BinTree* CreateBiTree();
void PrintBTree(BinTree *bt);
int s[50];//全局变量数组,用于储存层序遍历的二叉树
int num;//全局变量,结点的数量
int main()
{
//输入数组,是层序遍历二叉树的结果
//空结点用-1表示
int i;
for(i=0; i<50; i++)
s[i] = -1;
printf("请输入结点的数量:");
scanf("%d", &num);
printf("请输入层序遍历二叉树的结果:");
for(i=0; i<num; i++)
{
scanf("%d", &s[i]);
if(s[i] == -1)
num++;
}
BinTree *root;//定义二叉树的根节点指针
root = CreateBiTree();
printf("先序遍历二叉树结果:");
PrintBTree(root);
return 0;
}
int ptr;//层序遍历数组的指针
BinTree * ptr_array[100];
int front=0, rear=0;
BinTree* CreateBiTree()
{
int n = num;
int data, data1, data2;
BinTree *p, *q, *bt;
data = s[ptr];
ptr++;
if(data != -1)
{
bt = (BinTree *)malloc(sizeof(BinTree));
bt->data = data;
bt->rchild = bt->lchild = NULL;
ptr_array[rear] = bt;
rear++;
n--;
}else
return NULL;
while(n > 0 && ptr < num)
{
p = ptr_array[front];
front++;
data1 = s[ptr++];
if(data1 == -1)
p->lchild = NULL;
else{
q = (BinTree *)malloc(sizeof(BinTree));
q->data = data1;
p->lchild = q;
q->rchild = q->lchild = NULL;
ptr_array[rear] = q;
rear++;
n--;
}
data2 = s[ptr++];
if(data2 == -1)
p->rchild = NULL;
else{
q = (BinTree *)malloc(sizeof(BinTree));
q->data = data2;
p->rchild = q;
q->lchild = q->rchild = NULL;
ptr_array[rear] = q;
rear++;
n--;
}
}
return bt;
}
void PrintBTree(BinTree *bt)
{
if(bt != NULL && bt->data != -1)
{
printf("%d ", bt->data);
PrintBTree(bt->lchild);
PrintBTree(bt->rchild);
}
}
运行结果:
嗯…我个人觉得单纯的各种顺序print并不难,有的时候难的反而是创建结构的过程,所以着重学习吧!!