非递归队列方法建立层次二叉树
思想:要认清rear和front的关系
1:函数刚开始rear== 0是要在while中第一次起作用,rear == front 表示栈空.
2:看函数体,当rear在自增后卫奇数时,此时q[front]的右孩子已经处理完,跟紧其后的是front++,
表明下一个处理的节点为当前处理节点的兄弟节点或者堂兄弟节点,反正就是往右的下一个节点.
3:算法用到了数组指针,每个元素存放已输入节点的地址,其中rear和front的关系为front + 2 = rear
4:因为队列的性质,所以从函数课已看出来[front]为当前急需出对的节点,[rear]为当前继续出队节点的左孩子或右孩子
bitree *q[MAX];
bitree *creat()
{
int x;
int front,rear;
bitree *root,*s;
root = NULL;
s = NULL;
front = 1;
rear = 0;
printf("\n\t\t请输入,结束输入-99,叶节点输入0:");
scanf("%d",&x);
while(x != -99)
{
if(x != 0)
{
{
s = new bitree;
s->data = x;
s->lchild = NULL;
s->rchild = NULL;
}
rear = rear + 1;
q[rear] = s;
if(rear == 1)
root = s;
else
{
if(s && q[front])
{
//因为数组指针总存放的规律的节点地址,所以front一次处理就行了
if(rear % 2 == 0)
{
q[front]->lchild = s;
}
else
{
q[front]->rchild = s;
}
}
if(rear%2 == 1)front = front + 1;
}
}
printf("\n\t\t请输入,结束输入-99,叶节点输入0:");
scanf("%d",&x);
}
return root;
}