编写一个操纵二叉查找树的程序。它将从标准输入接收命令,并将这些命令的响应打印到标准输出。 二叉查找树是一棵二叉树,它在内部节点存储整数值。特定节点的值大于存储在其左侧子树中的每个值,小于存储在其右侧子树中的每个值。该树不包含重复值。 请注意,在创建新节点时,需要使用malloc为它们分配空间;一旦不再需要任何已分配的空间,就应该使用free将其释放。
时间: 2024-03-27 21:36:10 浏览: 51
好的,这是一个经典的数据结构问题,我会尽力回答你的问题。首先,我们需要了解二叉查找树的基本操作,包括插入、查找、删除和遍历。然后,我们可以根据输入的命令执行相应的操作,并将结果打印到标准输出。
下面是一个简单的C程序,用于实现一个二叉查找树。它包含节点的定义和基本操作的实现。
```c
#include <stdio.h>
#include <stdlib.h>
// 节点定义
typedef struct Node {
int value;
struct Node* left;
struct Node* right;
} Node;
// 插入节点
void insert(Node** root, int value) {
if (*root == NULL) {
// 创建新节点
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->value = value;
new_node->left = NULL;
new_node->right = NULL;
*root = new_node;
} else if (value < (*root)->value) {
// 插入左子树
insert(&((*root)->left), value);
} else {
// 插入右子树
insert(&((*root)->right), value);
}
}
// 查找节点
Node* search(Node* root, int value) {
if (root == NULL || root->value == value) {
return root;
} else if (value < root->value) {
return search(root->left, value);
} else {
return search(root->right, value);
}
}
// 删除节点
Node* delete(Node* root, int value) {
if (root == NULL) {
return root;
} else if (value < root->value) {
root->left = delete(root->left, value);
} else if (value > root->value) {
root->right = delete(root->right, value);
} 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 = root->right;
while (temp && temp->left != NULL) {
temp = temp->left;
}
root->value = temp->value;
root->right = delete(root->right, temp->value);
}
return root;
}
// 中序遍历
void inorder_traversal(Node* root) {
if (root != NULL) {
inorder_traversal(root->left);
printf("%d ", root->value);
inorder_traversal(root->right);
}
}
// 主函数
int main() {
Node* root = NULL;
char ch;
int value;
while (1) {
scanf("%c", &ch);
if (ch == 'i') {
scanf("%d", &value);
insert(&root, value);
} else if (ch == 's') {
scanf("%d", &value);
Node* result = search(root, value);
if (result == NULL) {
printf("Not Found\n");
} else {
printf("Found\n");
}
} else if (ch == 'd') {
scanf("%d", &value);
root = delete(root, value);
} else if (ch == 't') {
inorder_traversal(root);
printf("\n");
} else {
break;
}
}
return 0;
}
```
在这个程序中,我们使用指针来操作树。在插入节点时,我们检查当前节点是否为空,如果为空则创建一个新节点并将其设置为根节点。否则,我们递归地向左或右子树插入节点。在查找节点时,我们递归地向左或右子树搜索节点。在删除节点时,我们递归地向左或右子树删除节点。如果当前节点有两个子节点,则用右子树的最小值替换它。最后,我们实现了一个中序遍历函数,用于遍历整个树。
在主函数中,我们循环读取输入的命令,并根据命令执行相应的操作。命令包括插入、查找、删除和遍历。当输入不再是这些命令中的任何一个时,程序退出。
注意,在使用malloc分配内存时,我们需要在不再需要时使用free释放它。这可以避免内存泄漏问题。
阅读全文