先序遍历一个二叉树,用具体C语言代码来实现判断一个二叉树是否为完全二叉树?
时间: 2024-12-28 14:39:27 浏览: 3
先序遍历是一种访问二叉树节点的方式,通常是根-左-右的顺序。对于完全二叉树,它具有的特性是除了最后一层外,每一层都是满的,并且所有节点都尽可能地向左填充。
判断一个二叉树是否为完全二叉树,可以通过先序遍历并记录每个层次的节点数,然后检查剩余节点能否均匀分配在下一层。如果能够,则该树是完全二叉树。以下是C语言的一个简单实现:
```c
#include <stdio.h>
#include <stdbool.h>
// 定义二叉树结点结构
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 辅助函数用于递归先序遍历并计数
int countNodes(TreeNode* root) {
if (root == NULL)
return 0;
return 1 + countNodes(root->left) + countNodes(root->right);
}
bool isCompleteBinaryTree(TreeNode* root) {
int levelCount = 1; // 初始化层数为1
int maxLevelNodes = 1; // 当前层数的最大节点数
TreeNode* current = root;
while (current != NULL) {
maxLevelNodes = MAX(maxLevelNodes, countNodes(current));
if (levelCount % 2 == 0) { // 如果当前层是偶数层
if (countNodes(current) < maxLevelNodes) { // 非满的层直接返回false
return false;
}
} else { // 奇数层
if (countNodes(current) > maxLevelNodes) { // 如果当前层不是最顶层并且比上一层多节点,也不是完全二叉树
return false;
}
}
current = current->left ? current->left : current->right;
levelCount++;
}
return true; // 树遍历结束,说明是完全二叉树
}
int main() {
// 测试用例...
TreeNode* tree = ...;
if (isCompleteBinaryTree(tree)) {
printf("The binary tree is a complete binary tree.\n");
} else {
printf("The binary tree is not a complete binary tree.\n");
}
return 0;
}
```
阅读全文