二叉树的层次建立方式(C语言)
二叉树的层次建立方式与先序、中序、后序建树的方式有较大区别。类似于深搜用递归、广搜用队列。
输入一组整数,0代表结点不存在,-1代表输入结束
有很多C++版本了,所以在这里完全用C语言实现
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *lchild, *rchild;
}BinTree;
BinTree *que[1000];
int s[1000],ss = 0;
int front = 0, rear = 0;
int num;
BinTree* CreateBiTree(void)
{
int n = num;
int d,d1,d2;
BinTree *t, *bt, *q;
d = s[ss++];
if(d != 0 && d != -1){
bt = (BinTree*)malloc(sizeof(BinTree));
bt->data = d;
bt->rchild = bt->lchild = NULL;
que[rear++] = bt;
n--;
}
else
return NULL;
while(n){
t = que[front];
front++;
if(n == 0)
break;
d1 = s[ss++];
if(d1 == -1)
break;
if(d1 != 0){
q = (BinTree*)malloc(sizeof(BinTree));
q->data = d1;
t->lchild = q;
q->rchild = q->lchild = NULL;
que[rear++] = q;
n--;
}
else
t->lchild = NULL;
d2 = s[ss++];
if(d2 == -1)
break;
if(d2 != 0){
q = (BinTree*)malloc(sizeof(BinTree));
q->data = d2;
t->rchild = q;
q->rchild = q->lchild = NULL;
que[rear++] = q;
n--;
}
else
t->rchild = NULL;
}
return bt;
}
void PrintBTree(BinTree *bt)
{
if(bt != NULL){
printf("%d ", bt->data);
PrintBTree(bt->lchild);
PrintBTree(bt->rchild);
}
}
int main(void)
{
BinTree *root;
int n, i, j, k;
num = 0, ss = 0;
front = rear = 0;
while(1){
scanf("%d", &s[num]);
if(s[num] == -1)
break;
num++;
}
root = CreateBiTree();
PrintBTree(root);
printf("\n");
return 0;
}
初步添加注释版
bitree* CreateTree(){
char ch; //结点信息变量
bitree *Q[MAXSIZE]; //设置指针类型数组来构成队列
int front, rear; //队头和队尾指针变量
bitree *root, *s; //根节点指针和中间指针变量
root = NULL; //二叉树置空
front = 1, rear = 0; //设置队列指针变量初值
while((ch=getchar()) != '#'){
//输入一个字符,当不是结束符时执行以下操作
s = NULL;
if(ch != '@'){
s = (bitree*)malloc(sizeof(bitree));
s->data = ch;
s->lchild = NULL;
s->rchild = NULL;
}
rear++; //队尾指针增1,指向新结点地址存放的单元
Q[rear] = s;
if(rear == 1)
root = s;
else{
if(s && Q[front]){
if(rear%2 == 0)
//rear为偶数,新结点是左孩子
Q[front]->lchild = s;
else
//rear为奇数,新结点是右孩子
Q[front]->rchild = s;
}
if(rear%2 == 1)
//结点*Q[front]的两个孩子处理完毕,出队
front++;
}
}
return root;
}