#include <stdio.h>
#include <stdlib.h>
typedef int datatype ;
typedef struct node {
datatype data;
struct node *left, *right;
}BitTree;
//辅助队列Q,这是用来存关系的
BitTree* Q[16];//这是一个指针数组,它将缓存节点的地址,因为这个地址将以
//left域,或者right域进入二叉链表,它本身不维护i,2i,2i+1的关系
//他的关系通过front,rear来维护
//按照直观的建立,我们首先想到的是层次法
//我们根据层次,来逐一将二叉树建立
//输入的数组是按照完全二叉树的编号规则设立,即
//数组角标反映了节点位置关系(存联系)
//逐个扫描数组,直到所有的节点都存取完毕之后,就结束
//约定,0表示数组当前元素为空,最后一个节点标志是-999
BitTree* CreateBinTree(int arr[]) {
int i = 1;
//只要我们没有扫描完元素,那么这个二叉链表就没有完成
//只要扫描,我们就malloc一个节点,然后把这个节点存入left域或者right域
int front = 1, rear = 0;
BitTree* root = NULL;
BitTree* s;//暂存节点
while (arr[i]!=-999) {
s = NULL;
if (arr[i] != 0) {//意味着这个不是空节点,那么我们就要分配空间
s = (BitTree*)malloc(sizeof(BitTree));
s->data = arr[i];//存数值
s->left = NULL;
s->right = NULL;
}
//要让我们新节点入队,进入缓存,等待分配双亲的left域和right域
Q[++rear] = s;
if (rear == 1)
{
root = s;
}
else {
if (s != NULL && Q[front]) {
if (rear % 2 == 0) {
Q[front]->left = s;
}
else {
Q[front]->right = s;
}
}
if (rear % 2 == 1)
front++;
}
i++;
}
return root;
}
//树遍历问题:非线性结构的输出问题:前序,中序,后序
void inorder(BitTree *t) {
if (t) {
inorder(t->left);
printf("%d ", t->data);
inorder(t->right);
}
}
void preorder(BitTree* t) {
if (t) {
//根左右
printf("%d ", t->data);
preorder(t->left);
preorder(t->right);
}
}
void postorder(BitTree* t) {
if (t) {
//左右根
postorder(t->left);
postorder(t->right);
printf("%d ", t->data);
}
}
int main(void) {
int arr[17] = {0,6,3,8,
2,5,7,9,
0,0,4,0,
0,0,0,10,
-999
};
BitTree *root = CreateBinTree(arr);
inorder(root);
getchar();
return 0;
}