用c语言编写代码,实现二叉树的建立、遍历(前序、中序、后序)、节点的插入和删除等基本操作
时间: 2024-10-12 07:06:06 浏览: 13
在C语言中,我们可以使用结构体来表示二叉树节点,并通过指针来连接它们。这里是一个简单的示例,展示了如何创建二叉树的基本操作:
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
// 创建新节点并分配内存
Node* newNode(int data) {
Node* node = (Node*)malloc(sizeof(Node));
if (node == NULL) {
printf("Memory allocation failed.\n");
return NULL;
}
node->data = data;
node->left = node->right = NULL;
return node;
}
// 前序遍历(根-左-右)
void preOrderTraversal(Node* root) {
if (root != NULL) {
printf("%d ", root->data);
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
}
// 中序遍历(左-根-右)
void inOrderTraversal(Node* root) {
if (root != NULL) {
inOrderTraversal(root->left);
printf("%d ", root->data);
inOrderTraversal(root->right);
}
}
// 后序遍历(左-右-根)
void postOrderTraversal(Node* root) {
if (root != NULL) {
postOrderTraversal(root->left);
postOrderTraversal(root->right);
printf("%d ", root->data);
}
}
// 插入节点
Node* insertNode(Node* root, int data) {
if (root == NULL) {
return newNode(data);
}
// 如果数据小于根节点,则在左子树中递归插入
if (data < root->data)
root->left = insertNode(root->left, data);
// 如果数据大于根节点,则在右子树中递归插入
else if (data > root->data)
root->right = insertNode(root->right, data);
return root;
}
// 删除节点(这里仅简单处理移除叶子节点的情况,实际删除可能更复杂)
Node* deleteNode(Node* root, int key) {
if (root == NULL) return root;
if (key < root->data)
root->left = deleteNode(root->left, key);
else if (key > root->data)
root->right = deleteNode(root->right, key);
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;
}
// 替换为右子树的最大值(或左子树的最小值)
int minValue = findMin(root->right);
root->data = minValue;
root->right = deleteNode(root->right, minValue); // 在右子树中继续删除
}
return root;
}
// 查找最小值用于删除替换
int findMin(Node* node) {
while (node->left != NULL) {
node = node->left;
}
return node->data;
}
// 示例:主函数
int main() {
Node* root = NULL;
root = insertNode(root, 50);
insertNode(root, 30);
insertNode(root, 20);
insertNode(root, 40);
insertNode(root, 70);
insertNode(root, 60);
insertNode(root, 80);
printf("Preorder traversal: ");
preOrderTraversal(root);
printf("\n");
printf("Inorder traversal: ");
inOrderTraversal(root);
printf("\n");
printf("Postorder traversal: ");
postOrderTraversal(root);
printf("\n");
// 示例删除节点
root = deleteNode(root, 30);
// ...其他操作...
return 0;
}
```
阅读全文