📜  bst 中的删除 - C++ (1)

📅  最后修改于: 2023-12-03 14:39:36.006000             🧑  作者: Mango

BST 中的删除 - C++

在二叉搜索树(Binary Search Tree,简称 BST)中,如果需要删除某个节点,需要考虑下面三种情况:

  1. 节点为叶子节点:直接删除。

  2. 节点只有一个子节点:将子节点提升为当前节点的位置。

  3. 节点有两个子节点:找到当前节点的后继节点(右子树中最小的节点),将其值复制到当前节点,然后删除后继节点。

下面是一个 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 的结构性质。

注意,在删除节点后需要及时释放其内存空间,避免出现内存泄漏。