设计并验证如下算法:二叉树采用二叉链表结构表示,按输入的关键字序列建立一棵二叉排序树,并删除该二叉排序树上的某个结点 完整c代码实现
时间: 2025-01-01 15:36:19 浏览: 15
在C语言中,我们可以首先定义一个二叉链表节点的数据结构,然后构建二叉排序树并提供删除节点的功能。这里是一个简单的实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉链表节点结构
typedef struct TreeNode {
int key; // 节点值
struct TreeNode* left; // 左子节点
struct TreeNode* right; // 右子节点
} TreeNode;
// 创建新节点
TreeNode* createNode(int key) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
if (!newNode) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->key = key;
newNode->left = newNode->right = NULL;
return newNode;
}
// 插入节点到二叉排序树
TreeNode* insert(TreeNode** root, int key) {
if (*root == NULL) {
*root = createNode(key);
} else if (key < (*root)->key) {
insert(&(*root)->left, key);
} else {
insert(&(*root)->right, key);
}
return *root;
}
// 删除节点(使用递归)
TreeNode* deleteNode(TreeNode** root, int key) {
if (*root == NULL) {
return NULL;
}
if (key < (*root)->key) {
(*root)->left = deleteNode(&(*root)->left, key);
} else if (key > (*root)->key) {
(*root)->right = deleteNode(&(*root)->right, key);
} else { // 找到了要删除的节点
if ((*root)->left == NULL && (*root)->right == NULL) { // 叶子节点
free(*root);
*root = NULL;
} else if ((*root)->left == NULL) { // 只有右子节点
TreeNode* temp = *root;
*root = (*root)->right;
free(temp);
} else if ((*root)->right == NULL) { // 只有左子节点
TreeNode* temp = *root;
*root = (*root)->left;
free(temp);
} else { // 有两个子节点
TreeNode* temp = findMin(*root->right); // 找到右子树最小值节点
(*root)->key = temp->key;
(*root)->right = deleteNode(&(*root)->right, temp->key); // 用找到的最小值替换当前节点,然后递归删除原最小值节点
}
}
return *root;
}
// 查找最小值节点
TreeNode* findMin(TreeNode* node) {
while (node->left != NULL) {
node = node->left;
}
return node;
}
// 验证删除操作是否正确(仅用于测试)
void verifyDelete(TreeNode* root, const int keys[]) {
for (int i = 0; keys[i] != -1; ++i) {
TreeNode* node = deleteNode(&root, keys[i]);
if (node == NULL) {
printf("Failed to delete %d\n", keys[i]);
} else {
printf("Deleted %d successfully\n", keys[i]);
}
}
}
int main() {
TreeNode* root = NULL;
int keys[] = {5, 3, 7, 1, 4, 6, 8};
// 构建二叉排序树
for (int i = 0; keys[i] != -1; ++i) {
root = insert(&root, keys[i]);
}
// 删除特定节点(比如keys[2]=7)
root = deleteNode(&root, 7);
// 验证删除操作
verifyDelete(root, keys);
return 0;
}
```
这个程序首先创建了一个二叉排序树,然后演示了如何删除指定节点。`verifyDelete`函数用于验证删除操作是否正确。请注意,实际项目中可能需要处理更多边界情况以及错误处理。
阅读全文