编写一个c++函数用来从二叉查找树中删除键值为k的元素
时间: 2024-11-25 13:33:36 浏览: 3
二叉查找树实现源码(C、C++、JAVA)
在C++中,你可以编写一个递归函数来从二叉搜索树(BST)中删除键值为`k`的元素。这里是一个简单的示例:
```cpp
struct Node {
int key;
Node* left;
Node* right;
// 构造函数
Node(int val) : key(val), left(nullptr), right(nullptr) {}
};
class BST {
private:
Node* root;
// 删除节点的辅助函数
Node* deleteNode(Node*& node, int k) {
if (node == nullptr)
return node;
if (k < node->key)
node->left = deleteNode(node->left, k);
else if (k > node->key)
node->right = deleteNode(node->right, k);
else { // 找到了要删除的节点
if (node->left == nullptr) { // 只有一个孩子或没有孩子
Node* temp = node->right; // 保存右孩子的指针
if (temp != nullptr)
temp->parent = nullptr; // 更新右孩子的父节点
node = temp; // 或者直接替换为右孩子
} else if (node->right == nullptr) { // 只有左孩子
Node* temp = node->left; // 保存左孩子的指针
if (temp != nullptr)
temp->parent = nullptr; // 更新左孩子的父节点
node = temp; // 或者直接替换为左孩子
} else { // 有两个孩子
Node* temp = findMin(node->right); // 寻找右子树最小节点
node->key = temp->key; // 替换键值
node->right = deleteNode(node->right, temp->key); // 从右子树继续删除
}
}
return node;
}
public:
void removeKey(int k) {
root = deleteNode(root, k);
}
// 其他辅助函数...
};
// 辅助函数:寻找右子树中的最小节点
Node* findMin(Node* node) {
while (node->left != nullptr)
node = node->left;
return node;
}
```
这个函数首先检查给定节点是否存在,如果存在则根据`k`与其比较,递归地在左右子树中查找。找到要删除的节点后,会处理三种情况:无孩子、单个孩子和两个孩子。
阅读全文