二叉树采用二叉链表存储,设计算法判断给定的二叉树是否是一棵完全二叉树,采用先进先出的队列。

来源:互联网 发布:张家界导游软件app 编辑:程序博客网 时间:2024/06/03 10:16


#include<stdio.h>
#include<stdlib.h>
typedef struct biTree { //二叉树结构
char data1;
struct biTree *lchild,*rchild;
}biTree,*linkbiTree;


typedef struct qNode { //链式队列类型
biTree data2;
struct qNode *next;
}qNode,*queuePtr;


typedef struct { //队列指针
queuePtr front;
queuePtr rear;
}linkQueue;


void initQueue(linkQueue &Q) { //队列初始化
Q.front = Q.rear =(queuePtr)malloc(sizeof(qNode));
if(! Q.front)
return;
Q.front->next = NULL;

}


void destroyQueue(linkQueue &Q) { //销毁队列
while(Q.front) {
Q.rear = Q.front->next;
free(Q.front);
}

}


void enQueue(linkQueue &Q,linkbiTree ptr) { //如入队列
queuePtr p;
p = (queuePtr)malloc(sizeof(qNode));
if(!p) 
return;
(p->data2).data1 = ptr->data1;
(p->data2).lchild = ptr->lchild;
(p->data2).rchild = ptr->rchild;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
}


void deQueue(linkQueue &Q,biTree &ptr) { //出队列
queuePtr p;
if(Q.front == Q.rear)
return;
p = Q.front->next;
ptr.data1 = (p->data2).data1;
ptr.lchild = (p->data2).lchild;
ptr.rchild = (p->data2).rchild;
Q.front->next = p->next;
if(Q.rear == p)
Q.rear = Q.front;
free(p);
}


int queueEmpty(linkQueue &Q) { //判空
if(Q.front == Q.rear)
return 1;
return 0;
}


int levedOrderTraverse(linkbiTree &bt) { //层次遍历二叉树,当出现空之后,后面不能出现出现节点,否则不是完全二叉树。

linkQueue Q;
int flag = 0;
biTree p;
if(bt) {
initQueue(Q);
enQueue(Q,bt);
while(!queueEmpty(Q)) {
deQueue(Q,p);
printf("%c\n",p.data1);
if(!(p.data1))
flag =1;
else if(flag)
return 0;
else{
enQueue(Q,p.lchild);
enQueue(Q,p.rchild);
}
}
}
return 1;
}




void creatbiTree(linkbiTree &bt) { //线序法建立二叉树,空节点也存入
char ch;
ch = getchar();
if(ch =='#') {
bt = (linkbiTree)malloc(sizeof(biTree));
bt->data1 = NULL;
}
else {
bt = (linkbiTree)malloc(sizeof(biTree));
bt->data1 = ch;
creatbiTree(bt->lchild);
creatbiTree(bt->rchild);
}
}


int main() {
linkbiTree bt;
int flag;
creatbiTree(bt);      
flag = levedOrderTraverse(bt);
if(flag)
printf("ok\n");
else
printf("error\n");
return 0;
}





0 0
原创粉丝点击