📅  最后修改于: 2023-12-03 14:39:36.006000             🧑  作者: Mango
在二叉搜索树(Binary Search Tree,简称 BST)中,如果需要删除某个节点,需要考虑下面三种情况:
节点为叶子节点:直接删除。
节点只有一个子节点:将子节点提升为当前节点的位置。
节点有两个子节点:找到当前节点的后继节点(右子树中最小的节点),将其值复制到当前节点,然后删除后继节点。
下面是一个 C++ 的实现代码:
/*
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if (!root) return nullptr; // 节点为空,返回 nullptr
if (key < root->val) { // 待删除节点在左子树中
root->left = deleteNode(root->left, key);
} else if (key > root->val) { // 待删除节点在右子树中
root->right = deleteNode(root->right, key);
} else { // 当前节点为待删除节点
if (!root->left && !root->right) { // 节点为叶子节点
delete root;
return nullptr;
} else if (!root->left) { // 节点只有右子节点
TreeNode* cur = root->right;
delete root;
return cur;
} else if (!root->right) { // 节点只有左子节点
TreeNode* cur = root->left;
delete root;
return cur;
} else { // 节点有两个子节点
TreeNode* prev = nullptr;
TreeNode* cur = root->right;
while (cur->left) {
prev = cur;
cur = cur->left;
}
root->val = cur->val;
if (prev) {
prev->left = deleteNode(cur, cur->val);
} else {
root->right = deleteNode(root->right, root->val);
}
}
}
return root;
}
};
以上代码实现了一个递归删除 BST 中的节点:若当前节点为空则返回 nullptr,若待删除节点在左子树中则递归遍历左子树,若待删除节点在右子树中则递归遍历右子树,否则当前节点为待删除节点,需要考虑节点的情况并进行删除操作,最后返回更新后的 BST 根节点。
其中,借助变量 prev
和指针引用 cur
,在待删除节点有两个子节点的情况下找到其后继节点进行删除,进一步保证了 BST 的结构性质。
注意,在删除节点后需要及时释放其内存空间,避免出现内存泄漏。