. 编写函数实现判断二叉树是否为完全二叉树。(空二叉树是完全 二叉树)
时间: 2024-10-12 17:01:09 浏览: 29
判断二叉树是否为完全二叉树的实例
判断一个给定的二叉树是否为完全二叉树,可以通过遍历节点并检查每个层级的节点数是否满足完全二叉树的要求来实现。在完全二叉树中,除了最后一层外,每一层的节点都是满的,且最右边的节点都尽可能靠左。
以下是一个简单的C语言函数,用于判断一个二叉树是否为完全二叉树:
```c
#include <stdbool.h>
// 定义二叉树节点结构体
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 判断是否为完全二叉树辅助函数
bool isCompleteBinaryTree(TreeNode* root) {
if (root == NULL) {
return true; // 空树视为完全二叉树
}
queue<TreeNode*> q; // 使用队列存储节点
q.push(root);
while (!q.empty()) {
int levelSize = q.size();
for (int i = 0; i < levelSize; ++i) {
TreeNode* node = q.front();
q.pop();
if (node->left != NULL && node->right != NULL) { // 如果当前节点有两个子节点
q.push(node->left);
q.push(node->right);
} else {
// 检查是否有节点未填满当前层级的剩余位置
bool hasIncompleteLevel = false;
if (levelSize > 1 && node->left != NULL) {
hasIncompleteLevel = true;
} else if (levelSize > 0 && node->right != NULL) {
hasIncompleteLevel = true;
}
if (hasIncompleteLevel) {
return false; // 找到不完整层级,直接返回false
}
}
}
}
return true; // 遍历完所有节点都没找到不完整层级,说明是完全二叉树
}
```
这个函数首先创建一个队列并将根节点放入。然后在每一轮循环中,处理当前层级的所有节点,如果遇到节点有右孩子但没有左孩子(或相反),则说明当前层级不满,立即返回`false`。只有当所有层级都被正确填充时,才返回`true`表示完全二叉树。
阅读全文