用C语言代码实现完全二叉树要求: (1)创建一个有n个结点的二叉链存储结构完全二叉树(参见习题8-34)。 (2)判断该二叉树是否为完全二叉树。 (3)创建一一个有 n个结点的二叉链存储结构非完全二叉树,并判断该二叉树是否为完全二叉树。
时间: 2024-01-11 12:04:35 浏览: 76
你好!感谢您的提问。以下是我对您的问题的回答:
1. 用C语言代码实现完全二叉树:
完全二叉树是指除了最后一层的节点不满外,其它每一层的节点数都是最大节点数。而最后一层的节点都靠左排列。所以我们需要根据这个特点来构建完全二叉树。
首先,我们需要定义完全二叉树的节点结构体:
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
接着,我们可以用数组来表示完全二叉树。因为完全二叉树的节点是从上到下、从左到右依次排列的,所以我们可以按照这个顺序将二叉树的节点存储在一个数组中。具体代码实现如下:
struct TreeNode* createCompleteBinaryTree(int* nums, int n) {
struct TreeNode** nodes = (struct TreeNode**)malloc(n * sizeof(struct TreeNode*));
int i;
for (i = 0; i < n; i++) {
if (nums[i] == -1) {
nodes[i] = NULL;
} else {
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->val = nums[i];
nodes[i] = node;
}
}
for (i = 0; i < n; i++) {
if (!nodes[i]) {
continue;
}
int left = i * 2 + 1;
int right = i * 2 + 2;
if (left < n) {
nodes[i]->left = nodes[left];
}
if (right < n) {
nodes[i]->right = nodes[right];
}
}
return nodes[0];
}
上面的代码中,nums数组是按照二叉树的从上到下、从左到右的顺序存储的节点值,-1表示该节点为空。
2. 判断该二叉树是否为完全二叉树:
要判断是否为完全二叉树,我们需要使用bfs(宽度优先搜索)遍历的方式遍历整棵树。具体代码实现如下:
bool isCompleteBinaryTree(struct TreeNode* root) {
if (!root) {
return true;
}
struct TreeNode** queue = (struct TreeNode**)malloc(1000 * sizeof(struct TreeNode*));
int front = 0;
int rear = 0;
bool flag = false;
queue[rear++] = root;
while (front != rear) {
struct TreeNode* node = queue[front++];
if (!node) {
flag = true;
} else {
if (flag) {
return false;
}
queue[rear++] = node->left;
queue[rear++] = node->right;
}
}
return true;
}
上面的代码中,我们使用队列来实现宽度优先搜索,如果遇到空节点,则将之后的所有节点都应该是空节点。
3. 创建一个有n个结点的二叉链存储结构非完全二叉树,并判断该二叉树是否为完全二叉树。
我们可以按照以下方式构建一个非完全二叉树:将值为1~n的节点插入到二叉树中,插入顺序是随机的。具体代码实现如下:
struct TreeNode* createNonCompleteBinaryTree(int n) {
struct TreeNode* root = NULL;
int* nums = (int*)malloc(n * sizeof(int));
int i;
for (i = 0; i < n; i++) {
nums[i] = i + 1;
}
for (i = 0; i < n; i++) {
int j = rand() % (n - i) + i;
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
for (i = 0; i < n; i++) {
root = insert(root, nums[i]);
}
return root;
}
上面的代码中,我们首先用一个数组按顺序存储1~n个数字,然后随机打乱这个数组,将数字插入到二叉树中。
我们可以调用上面的isCompleteBinaryTree函数来判断这颗二叉树是否为完全二叉树。
希望我的回答能够帮到您。如果您有其他问题,可以继续提问哟。
阅读全文