帮我用c语言写一个可以创建二叉树的代码并带有增加结点方法和删除结点方法
时间: 2024-05-16 11:16:58 浏览: 20
好的,这里是一个简单的二叉树的创建、增加结点和删除结点的代码,供您参考:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
Node* create_node(int data) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
Node* insert_node(Node* root, int data) {
if (root == NULL) {
return create_node(data);
} else if (data < root->data) {
root->left = insert_node(root->left, data);
} else if (data > root->data) {
root->right = insert_node(root->right, data);
}
return root;
}
Node* find_min_node(Node* node) {
Node* current = node;
while (current && current->left != NULL) {
current = current->left;
}
return current;
}
Node* delete_node(Node* root, int data) {
if (root == NULL) {
return root;
} else if (data < root->data) {
root->left = delete_node(root->left, data);
} else if (data > root->data) {
root->right = delete_node(root->right, data);
} else {
if (root->left == NULL) {
Node* temp = root->right;
free(root);
return temp;
} else if (root->right == NULL) {
Node* temp = root->left;
free(root);
return temp;
}
Node* temp = find_min_node(root->right);
root->data = temp->data;
root->right = delete_node(root->right, temp->data);
}
return root;
}
void inorder_traversal(Node* root) {
if (root == NULL) {
return;
}
inorder_traversal(root->left);
printf("%d ", root->data);
inorder_traversal(root->right);
}
int main() {
Node* root = NULL;
root = insert_node(root, 10);
insert_node(root, 5);
insert_node(root, 15);
insert_node(root, 3);
insert_node(root, 7);
insert_node(root, 12);
insert_node(root, 17);
printf("Inorder traversal of the binary search tree: ");
inorder_traversal(root);
printf("\n");
root = delete_node(root, 12);
printf("Inorder traversal of the binary search tree after deleting 12: ");
inorder_traversal(root);
printf("\n");
return 0;
}
```
这个程序中,`Node` 结构体表示二叉树的一个结点,其中包含 `int data` 表示结点的数据、 `Node* left` 和 `Node* right` 表示左右子树指针。
`create_node` 函数用于创建一个新的结点,并将数据初始化为传入的参数值。
`insert_node` 函数用于插入一个新的结点到二叉树中,如果根节点为空,则直接插入到根节点;否则,如果待插入的数据小于根节点的数据,则递归地插入到左子树中;如果待插入的数据大于根节点的数据,则递归地插入到右子树中。
`find_min_node` 函数用于查找二叉树中最小的结点(即最左边的结点)。
`delete_node` 函数用于删除二叉树中的一个结点。如果待删除的结点没有左右子树,则直接删除该结点;如果待删除的结点只有一个子树,则将该子树上移;如果待删除的结点有左右子树,则找到其右子树中最小的结点,将其值赋给待删除的结点,然后删除右子树中的这个最小结点。
`inorder_traversal` 函数用于对二叉树进行中序遍历,输出按升序排列的结点值。
在 `main` 函数中,我们首先创建一个空的根节点,然后依次插入一些结点,最后进行中序遍历。接着,我们删除一个结点,再次进行中序遍历,以验证删除操作是否正确。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)