写一个c语言的完全二叉树
时间: 2023-08-31 18:31:13 浏览: 112
### 回答1:
很高兴回答您的问题。以下是一个 C 语言的完全二叉树的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
struct TreeNode* createNode(int val) {
struct TreeNode* node = (struct TreeNode*) malloc(sizeof(struct TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
struct TreeNode* insertLevelOrder(int arr[], struct TreeNode* root, int i, int n) {
if (i < n) {
struct TreeNode* temp = createNode(arr[i]);
root = temp;
root->left = insertLevelOrder(arr, root->left, 2 * i + 1, n);
root->right = insertLevelOrder(arr, root->right, 2 * i + 2, n);
}
return root;
}
void printInOrder(struct TreeNode* root) {
if (root != NULL) {
printInOrder(root->left);
printf("%d ", root->val);
printInOrder(root->right);
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5, 6, 7};
int n = sizeof(arr)/sizeof(arr[]);
struct TreeNode* root = insertLevelOrder(arr, root, , n);
printf("Inorder traversal of the constructed tree: ");
printInOrder(root);
return ;
}
```
这个程序创建了一个完全二叉树,并按照中序遍历的顺序打印了树中的节点值。希望这个程序能够帮助您理解如何在 C 语言中实现完全二叉树。
### 回答2:
下面是一个用 C 语言实现的完全二叉树:
```c
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* left;
struct Node* right;
};
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
void insertNode(struct Node* root, int data) {
if (root->left == NULL)
root->left = createNode(data);
else if (root->right == NULL)
root->right = createNode(data);
else {
// 如果左右子节点都已存在,则从左向右寻找下一个可以插入节点的位置
struct Node* temp = root->left;
while (temp->left != NULL && temp->right != NULL) {
temp = temp->left;
}
insertNode(temp, data);
}
}
void inorderTraversal(struct Node* root) {
if (root == NULL)
return;
inorderTraversal(root->left);
printf("%d ", root->data);
inorderTraversal(root->right);
}
int main() {
struct Nodetree* root = createNode(1);
insertNode(root, 2);
insertNode(root, 3);
insertNode(root, 4);
insertNode(root, 5);
printf("完全二叉树的中序遍历结果:");
inorderTraversal(root);
return 0;
}
```
这段代码定义了一个包含节点数据、左子节点和右子节点的 `Node` 结构体,通过 `createNode()` 函数创建节点,`insertNode()` 函数将节点插入到树中。其中,`insertNode()` 函数使用了遍历的方式来找到下一个可以插入节点的位置,保证了完全二叉树的性质。最后,在 `main()` 函数中创建了一颗完全二叉树,并进行了中序遍历打印。
### 回答3:
完全二叉树是一种特殊的二叉树,它的每个节点都有两个子节点(当然最后一层除外),而且最后一层的节点都靠左对齐。下面是一个使用C语言来实现的完全二叉树的示例:
```c
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* left;
struct Node* right;
};
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
if (newNode == NULL) {
fprintf(stderr, "内存分配失败!\n");
exit(1);
}
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
void insert(struct Node* root, int data) {
struct Node* newNode = createNode(data);
if (root == NULL) {
root = newNode;
return;
}
struct Node* queue[100];
int front = 0;
int rear = 0;
queue[rear++] = root;
while (front != rear) {
struct Node* current = queue[front++];
if (current->left == NULL) {
current->left = newNode;
return;
} else {
queue[rear++] = current->left;
}
if (current->right == NULL) {
current->right = newNode;
return;
} else {
queue[rear++] = current->right;
}
}
}
void inorderTraversal(struct Node* root) {
if (root != NULL) {
inorderTraversal(root->left);
printf("%d ", root->data);
inorderTraversal(root->right);
}
}
int main() {
struct Node* root = createNode(1);
insert(root, 2);
insert(root, 3);
insert(root, 4);
insert(root, 5);
printf("中序遍历结果:");
inorderTraversal(root);
printf("\n");
return 0;
}
```
这个示例中,我们首先定义了一个`Node`结构,表示二叉树的节点。`createNode`函数用于创建一个拥有给定值的节点,并将其左右子节点初始化为`NULL`。`insert`函数用于向二叉树中插入一个新的节点,它采用了广度优先搜索的思想,利用一个辅助队列来找到合适的插入位置。
在`main`函数中,我们创建了一个根节点,并向树中插入了一些节点。最后,我们通过中序遍历的方式输出了二叉树的节点值。
这只是一个简单的示例,你可以根据自己的需要扩展这个代码来实现更多的功能。
阅读全文