#include<stdio.h>
#include<stdlib.h>
typedef char DataType;
struct BiTreeNode
{
DataType data;
BiTreeNode *leftChild;
BiTreeNode *rightChild;
};
void initiateBiTree(BiTreeNode **root)
{
(*root) = (BiTreeNode*)malloc(sizeof(BiTreeNode));
(*root)->leftChild = NULL;
(*root)->rightChild = NULL;
}
BiTreeNode* leftInsert(BiTreeNode *curr, DataType data)
{
if (curr == NULL)
return NULL;
BiTreeNode *node = (BiTreeNode*)malloc(sizeof(BiTreeNode));
node->data = data;
node->rightChild = NULL;
node->leftChild = curr->leftChild;
curr->leftChild = node;
return node;
}
BiTreeNode* rightInsert(BiTreeNode *curr, DataType data)
{
if (curr == NULL)
return NULL;
BiTreeNode *node = (BiTreeNode*)malloc(sizeof(BiTreeNode));
node->data = data;
node->leftChild = NULL;
node->rightChild = curr->rightChild;
curr->rightChild = node;
return node;
}
void preOrder(BiTreeNode *root)
{
if (root != NULL)
{
printf("%c ", root->data);
preOrder(root->leftChild);
preOrder(root->rightChild);
}
}
void midOrder(BiTreeNode *root)
{
if (root != NULL)
{
preOrder(root->leftChild);
printf("%c ", root->data);
preOrder(root->rightChild);
}
}
typedef BiTreeNode queueDataType;
struct QueueNode
{
queueDataType data;
QueueNode *next;
};
struct Queue
{
QueueNode *head;
QueueNode *rear;
};
void initiateQueue(Queue *queue)
{
queue->head = NULL;
queue->rear = NULL;
}
bool isNotEmpty(Queue* queue)
{
if (queue->head == NULL)
return false;
return true;
}
void queueAppend(Queue *queue, queueDataType *data)
{
QueueNode *node = (QueueNode*)malloc(sizeof(QueueNode));
if (data != NULL)
{
node->data.data = data->data;
node->data.leftChild = data->leftChild;
node->data.rightChild = data->rightChild;
}
else {
node->data.data = '0';
node->data.leftChild = NULL;
node->data.rightChild = NULL;
}
node->next = NULL;
if (queue->rear == NULL)
{
queue->head = node;
queue->rear = node;
}
else
{
queue->rear->next = node;
queue->rear = node;
}
}
void queuePop(Queue*queue, queueDataType *data)
{
if (!isNotEmpty(queue))
return;
*data = queue->head->data;
queue->head = queue->head->next;
if (queue->head == NULL)
queue->rear = NULL;
}
void getHead(Queue *queue,queueDataType *head)
{
if (!isNotEmpty(queue))
head = NULL;
else
*head = (queue->head->data);
}
void print(Queue*queue)
{
printf("队列:");
QueueNode *p;
p = queue->head;
while (p!=NULL)
{
printf("%c ",p->data.data);
p = p->next;
}
printf("\n");
}
int isComplete(BiTreeNode *root)
{
if (root->leftChild == NULL && root->rightChild == NULL)
return 1;
Queue queue, *p1,*p2;
p1 = &queue;
p2 = &queue;
initiateQueue(p1);
queueAppend(p1,root);
BiTreeNode q;
while (1)
{
BiTreeNode *temp = (BiTreeNode*)malloc(sizeof(BiTreeNode));
getHead(p1, temp);
if (temp->data == '0')
break;
queuePop(p1, &q);
queueAppend(p1, temp->leftChild);
queueAppend(p1, temp->rightChild);
}
while (isNotEmpty(p2))
{
BiTreeNode *temp = (BiTreeNode*)malloc(sizeof(BiTreeNode));
getHead(p1, temp);
if (temp->data != '0')
return 0;
queuePop(p2, &q);
}
return 1;
}
int main()
{
BiTreeNode *root, *p;
initiateBiTree(&root);
p = leftInsert(root, 'A');
p = leftInsert(p, 'B');
leftInsert(p, 'D');
rightInsert(p, 'E');
p = rightInsert(root->leftChild, 'C');
rightInsert(p, 'G');
printf("二叉树前序遍历:");
preOrder(root->leftChild);
printf("\n");
printf("二叉树中序遍历:");
midOrder(root->leftChild);
printf("\n");
if (isComplete(root->leftChild))
printf("该二叉树是完全二叉树!\n");
else
printf("该二叉树不是完全二叉树!\n");
system("pause");
return 0;
}


这里是引用