判断给定的树是否为完全二叉树

#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';       // 用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');
//    leftInsert(p, 'F');
    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;
}

这里是引用
在这里插入图片描述
这里是引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烈焰星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值