设计一个读入一串整数构成一颗二叉排序树的程序,从二叉排序树中删除一个结点,使该二叉树仍保持二叉排序树的特性。c语言
时间: 2024-12-20 11:10:21 浏览: 19
设计一个读入一串整数构建二叉排序树并删除节点的C语言程序可以分为以下步骤:
1. 定义二叉树节点结构体:
```c
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
```
2. 创建二叉排序树的函数:
```c
Node* create_sorted_tree(int arr[], int start, int end) {
if (start > end)
return NULL;
int mid = (start + end) / 2;
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = arr[mid];
newNode->left = create_sorted_tree(arr, start, mid - 1);
newNode->right = create_sorted_tree(arr, mid + 1, end);
return newNode;
}
```
3. 删除节点的函数(考虑到四种删除情况):
```c
void delete_node(Node** root, int key) {
if (*root == NULL)
return;
// Case 1: 节点不存在
if ((*root)->data == key) {
Node* temp = *root;
if (temp->left == NULL && temp->right == NULL) {
free(temp); // 单独节点
*root = NULL;
} else if (temp->left == NULL) {
Node* temp_new = temp->right;
free(temp);
*root = temp_new; // 右子树无节点
} else if (temp->right == NULL) {
Node* temp_new = temp->left;
free(temp);
*root = temp_new; // 左子树无节点
} else {
// Case 2: 存在一个空子树
Node* temp_min = find_min(temp->right);
temp->data = temp_min->data;
delete_node(&temp->right, temp_min->data);
}
return;
}
// 递归查找和删除
if (key < (*root)->data)
delete_node(&(*root)->left, key);
else
delete_node(&(*root)->right, key);
}
// 辅助函数:找到最小元素
Node* find_min(Node* node) {
while (node->left != NULL)
node = node->left;
return node;
}
```
4. 测试示例:
```c
int main() {
int arr[] = {50, 30, 70, 20, 40, 60};
int n = sizeof(arr)/sizeof(arr[0]);
Node* root = create_sorted_tree(arr, 0, n - 1);
// 删除指定节点
delete_node(&root, 30);
// 遍历打印剩余节点
inorder_traversal(root);
return 0;
}
```
阅读全文