完全二叉树问题。要求: 1、创建一个有n个结点的二叉链存储结构完全二叉树; 2、判断该二叉树是否为完全二叉树; 创建一个有n个结点的二叉链存储结构非完全二叉树,并判断该二叉树是否为完全二叉树。用c语言
时间: 2024-12-13 13:04:16 浏览: 10
完全二叉树是一种特殊的二叉树,它满足以下条件:
1. 每一层节点都被尽可能填满,从左到右顺序排列。
2. 最后一层的所有节点都集中在左边。
在C语言中,我们可以这样操作:
1. **创建完全二叉树**:
- 使用递归或迭代的方式构建二叉链表。对于每个节点,首先检查是否有两个孩子,如果有,填充它们,然后继续对下一个位置做同样的事情,直到所有位置都有值或者达到叶子节点。
```c
struct Node {
int data;
struct Node* left;
struct Node* right;
};
void createFullBinaryTree(int n) {
if (n <= 0 || !n) return;
struct Node* root = malloc(sizeof(Node));
// 根据完全二叉树的特性,从中间开始填充节点
for (int i = n / 2; i > 0; i--) {
root->data = i;
root->left = right = NULL; // 初始化左右孩子为NULL
if (i * 2 <= n) { // 如果还有空间,添加左侧孩子
left = createNode(i * 2);
root->left = left;
}
if (i * 2 + 1 <= n) { // 如果还有空间,添加右侧孩子
right = createNode(i * 2 + 1);
root->right = right;
}
}
// 根据剩余节点的位置填充
while (root && n > 1) {
if (n % 2 == 1) {
root->right = createNode(n++);
} else {
break;
}
root = root->right;
}
}
```
2. **判断是否为完全二叉树**:
- 遍历整个树,如果在每一层的最后都没有剩余节点或者只剩下了最右边的节点,则认为是完全二叉树。
```c
bool isFullBinaryTree(struct Node* root) {
if (!root) return true;
queue<Node*> q;
q.push(root);
int level = 0;
while (!q.empty()) {
int count = 0;
while (!q.empty() && count < pow(2, level)) {
struct Node* node = q.front();
q.pop();
if (node->left && node->right) count += 2;
else if (node->left) count++;
else if (node->right) count++;
}
if (count != pow(2, level)) return false;
level++;
}
return true;
}
```
3. **创建非完全二叉树示例**:
- 只需在构造过程中违反完全二叉树规则即可,例如,随意跳过一些节点或不对称地分配节点。
```c
void createNonFullBinaryTree(int n) {
// ...此处参照createFullBinaryTree函数,但故意改变节点插入的顺序或模式
}
```
阅读全文