编写一个算法,判断二叉树是否是完全二叉树

本文介绍了如何使用C语言实现一个队列数据结构,以及利用队列操作来判断一个给定的二叉树是否为完全二叉树。算法包括初始化队列、入队、出队以及递归遍历节点的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>

#include <stdlib.h>

 

// 定义二叉树节点结构

struct TreeNode {

    int data;

    struct TreeNode* left;

    struct TreeNode* right;

};

 

// 定义队列节点结构

struct QueueNode {

    struct TreeNode* treeNode;

    struct QueueNode* next;

};

 

// 定义队列结构

struct Queue {

    struct QueueNode* front;

    struct QueueNode* rear;

};

 

// 初始化队列

void initQueue(struct Queue* q) {

    q->front = q->rear = NULL;

}

 

// 入队操作

void enqueue(struct Queue* q, struct TreeNode* treeNode) {

    struct QueueNode* newNode = (struct QueueNode*)malloc(sizeof(struct QueueNode));

    newNode->treeNode = treeNode;

    newNode->next = NULL;

 

    if (q->rear == NULL) {

        q->front = q->rear = newNode;

    } else {

        q->rear->next = newNode;

        q->rear = newNode;

    }

}

 

// 出队操作

struct TreeNode* dequeue(struct Queue* q) {

    if (q->front == NULL) {

        return NULL;

    }

 

    struct QueueNode* temp = q->front;

    struct TreeNode* treeNode = temp->treeNode;

 

    q->front = q->front->next;

 

    if (q->front == NULL) {

        q->rear = NULL;

    }

 

    free(temp);

 

    return treeNode;

}

 

// 判断是否为完全二叉树

int isCompleteBinaryTree(struct TreeNode* root) {

    if (root == NULL) {

        return 1; // 空树也是完全二叉树

    }

 

    struct Queue queue;

    initQueue(&queue);

 

    int flag = 0; // 标志位,表示是否遇到空节点

 

    enqueue(&queue, root);

 

    while (queue.front != NULL) {

        struct TreeNode* currentNode = dequeue(&queue);

 

        // 如果当前节点是空节点,设置标志位

        if (currentNode == NULL) {

            flag = 1;

        } else {

            // 如果遇到空节点后又遇到非空节点,说明不是完全二叉树

            if (flag) {

                return 0;

            }

 

            enqueue(&queue, currentNode->left);

            enqueue(&queue, currentNode->right);

        }

    }

 

    return 1; // 遍历完成,是完全二叉树

}

 

// 测试

int main() {

    // 构建一个二叉树作为示例

    struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));

    root->data = 1;

    root->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));

    root->left->data = 2;

    root->left->left = root->left->right = NULL;

    root->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));

    root->right->data = 3;

    root->right->left = root->right->right = NULL;

 

    // 判断是否为完全二叉树

    if (isCompleteBinaryTree(root)) {

        printf("是完全二叉树\n");

    } else {

        printf("不是完全二叉树\n");

    }

 

    // 释放内存

    free(root->left);

    free(root->right);

    free(root);

 

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值