用C语言实现二叉树
时间: 2023-10-11 16:10:36 浏览: 90
二叉树是一种常用的数据结构,C语言中可以通过结构体和指针来实现二叉树。下面是一个简单的二叉树实现示例,包括二叉树的创建、插入、删除和遍历操作。
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
struct node {
int data;
struct node *left;
struct node *right;
};
// 创建二叉树
struct node* create_tree() {
struct node *root;
int data;
printf("请输入根节点的数据:");
scanf("%d", &data);
root = (struct node*) malloc(sizeof(struct node));
if (!root) {
printf("内存分配失败\n");
exit(1);
}
root->data = data;
root->left = NULL;
root->right = NULL;
printf("请输入左子树(-1表示空节点):");
scanf("%d", &data);
if (data != -1) {
root->left = create_tree();
}
printf("请输入右子树(-1表示空节点):");
scanf("%d", &data);
if (data != -1) {
root->right = create_tree();
}
return root;
}
// 插入节点
void insert_node(struct node *root, int data) {
struct node *p;
p = (struct node*) malloc(sizeof(struct node));
if (!p) {
printf("内存分配失败\n");
exit(1);
}
p->data = data;
p->left = NULL;
p->right = NULL;
if (!root) {
root = p;
} else {
if (data < root->data) {
insert_node(root->left, data);
} else {
insert_node(root->right, data);
}
}
}
// 删除节点
struct node* delete_node(struct node *root, int data) {
struct node *p;
if (!root) {
printf("节点不存在\n");
} 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 && !root->right) {
free(root);
root = NULL;
} else if (!root->left) {
p = root;
root = root->right;
free(p);
} else if (!root->right) {
p = root;
root = root->left;
free(p);
} else {
p = root->right;
while (p->left) {
p = p->left;
}
root->data = p->data;
root->right = delete_node(root->right, p->data);
}
}
return root;
}
// 前序遍历二叉树
void preorder_traversal(struct node *root) {
if (root) {
printf("%d ", root->data);
preorder_traversal(root->left);
preorder_traversal(root->right);
}
}
// 中序遍历二叉树
void inorder_traversal(struct node *root) {
if (root) {
inorder_traversal(root->left);
printf("%d ", root->data);
inorder_traversal(root->right);
}
}
// 后序遍历二叉树
void postorder_traversal(struct node *root) {
if (root) {
postorder_traversal(root->left);
postorder_traversal(root->right);
printf("%d ", root->data);
}
}
// 释放二叉树空间
void free_tree(struct node *root) {
if (root) {
free_tree(root->left);
free_tree(root->right);
free(root);
}
}
int main() {
struct node *root;
int data;
root = create_tree();
printf("插入节点,请输入节点数据:");
scanf("%d", &data);
insert_node(root, data);
printf("删除节点,请输入节点数据:");
scanf("%d", &data);
root = delete_node(root, data);
printf("前序遍历结果为:");
preorder_traversal(root);
printf("\n");
printf("中序遍历结果为:");
inorder_traversal(root);
printf("\n");
printf("后序遍历结果为:");
postorder_traversal(root);
printf("\n");
free_tree(root);
return 0;
}
```
这是一个简单的二叉树实现,可以根据实际需要进行修改和完善。同时,需要注意二叉树的内存管理,避免内存泄漏和野指针等问题。
阅读全文