用C语言判断一棵树是否是完全二叉树
时间: 2024-12-13 17:19:15 浏览: 18
在C语言中,判断一棵树是否是完全二叉树需要遍历这棵树,并记录每个节点的深度信息。完全二叉树的特点是除了最后一层外,每一层都完全填满,且所有叶子节点都在最底层,且都是从左至右排列。
以下是一个简单的非递归方法,利用栈来辅助判断:
```c
#include <stdbool.h>
#include <stdio.h>
// 定义树节点结构体
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
bool isCompleteBinaryTree(TreeNode* root) {
if (root == NULL) return true; // 空树视为完全二叉树
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode* node = s.top();
s.pop();
if (node->left != NULL && node->right != NULL) { // 当前节点有两个孩子
s.push(node->left);
s.push(node->right);
} else if (node->left != NULL || node->right != NULL) { // 当前节点只有一个孩子
if (s.empty()) return false; // 如果还有剩余节点,则不符合完全二叉树规则
} else { // 没有孩子,检查是否到了最后一层
if (!s.empty()) continue; // 如果不是空栈,继续检查下一个节点
return true;
}
}
return false;
}
// 示例:
TreeNode* buildExampleTree() {
// 创建一个简单的二叉树
// 1
// / \
// 2 3
// / \ \
// 4 5 6
return createSomeNodes(1, 2, 3, 4, 5, 6);
}
int main() {
TreeNode* root = buildExampleTree();
bool isTreeComplete = isCompleteBinaryTree(root);
if (isTreeComplete)
printf("这是一棵完全二叉树。\n");
else
printf("这不是一棵完全二叉树。\n");
return 0;
}
// 相关问题--
1. 完全二叉树的性质有哪些?
2. 如何递归地实现这个函数?
3. 如果树的高度未知,如何修改上述代码来适应这种情况?
```
阅读全文