在二叉排序树中删除结点的完整代码
时间: 2024-08-13 11:07:23 浏览: 47
C#实现二叉排序树代码实例
在二叉排序树(Binary Search Tree, BST)中删除一个结点的过程通常分为三个主要步骤:查找结点、处理两种情况(结点没有子节点和结点有一个或两个子节点)以及保持BST的性质。这里是一个简单的C++实现,使用递归方法:
```cpp
#include <iostream>
// 定义二叉搜索树结点结构
struct Node {
int data;
Node* left;
Node* right;
};
// 创建新节点
Node* newNode(int data) {
Node* node = new Node();
if (!node) {
std::cerr << "Memory error\n";
return nullptr;
}
node->data = data;
node->left = node->right = nullptr;
return node;
}
// 删除结点的辅助函数
Node* search(Node* root, int key) {
if (root == nullptr) {
return nullptr;
}
if (key < root->data)
root->left = search(root->left, key);
else if (key > root->data)
root->right = search(root->right, key);
else {
// 找到结点,进行删除操作
if (root->left == nullptr) {
Node* temp = root->right;
delete root;
return temp;
}
else if (root->right == nullptr) {
Node* temp = root->left;
delete root;
return temp;
}
// 如果结点有两个子节点,找到右子树的最小值
Node* temp = findMin(root->right);
root->data = temp->data; // 用右子树最小值替换当前结点的值
root->right = deleteMin(root->right); // 在右子树中删除这个最小值
}
return root;
}
// 查找最小值结点
Node* findMin(Node* node) {
while (node->left != nullptr)
node = node->left;
return node;
}
// 删除右子树的最小值
Node* deleteMin(Node* node) {
if (node->left == nullptr) {
Node* temp = node->right;
delete node;
return temp;
}
node->left = deleteMin(node->left);
return node;
}
// 示例
int main() {
Node* root = newNode(50);
// 插入节点并构建示例BST...
int keyToRemove = 30; // 需要删除的值
root = search(root, keyToRemove);
// 删除后可能的操作...
return 0;
}
```
阅读全文