判断二叉树是否为完全二叉树算法c语言代码
时间: 2023-10-26 20:04:29 浏览: 115
用C语言判断一个二叉树是否为另一个的子结构
好的,我会保密的。下面是判断二叉树是否为完全二叉树的 C 语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 定义二叉树结构体
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 检查二叉树是否为完全二叉树
bool isCompleteTree(TreeNode* root) {
if (!root) {
return true;
}
// 定义一个队列
struct Queue {
TreeNode* node;
int idx;
}* q = NULL;
int front = 0, rear = 0;
// 先把根节点入队
q = (struct Queue*) malloc(sizeof(struct Queue));
q[rear++] = (struct Queue) {root, 1};
while (front < rear) {
// 队首节点出队
struct Queue cur = q[front++];
TreeNode* node = cur.node;
int idx = cur.idx;
// 如果队首节点的编号不等于当前二叉树节点数,说明不是完全二叉树
if (idx != front) {
return false;
}
// 如果有左子节点,则把左子节点入队
if (node->left) {
q = (struct Queue*) realloc(q, sizeof(struct Queue) * (rear + 1));
q[rear++] = (struct Queue) {node->left, idx * 2};
}
// 如果有右子节点,则把右子节点入队
if (node->right) {
q = (struct Queue*) realloc(q, sizeof(struct Queue) * (rear + 1));
q[rear++] = (struct Queue) {node->right, idx * 2 + 1};
}
}
// 遍历完整棵树后没有问题,说明是完全二叉树
return true;
}
// 测试
int main() {
TreeNode* root = (TreeNode*) malloc(sizeof(TreeNode));
root->val = 1;
root->left = (TreeNode*) malloc(sizeof(TreeNode));
root->left->val = 2;
root->left->left = (TreeNode*) malloc(sizeof(TreeNode));
root->left->left->val = 4;
root->left->right = (TreeNode*) malloc(sizeof(TreeNode));
root->left->right->val = 5;
root->right = (TreeNode*) malloc(sizeof(TreeNode));
root->right->val = 3;
root->right->left = (TreeNode*) malloc(sizeof(TreeNode));
root->right->left->val = 6;
//root->right->right = (TreeNode*) malloc(sizeof(TreeNode));
//root->right->right->val = 7;
bool res = isCompleteTree(root);
printf("%d", res);
return 0;
}
```
该算法使用队列进行广度优先搜索,遍历整个二叉树,同时用一个编号变量 `idx` 记录每个节点在二叉树中的位置编号。遍历完整棵树后如果没有问题,说明这是一棵完全二叉树。
阅读全文