📜  二叉搜索树 |第 3 组(迭代删除)(1)

📅  最后修改于: 2023-12-03 15:06:19.723000             🧑  作者: Mango

二叉搜索树 | 第 3 组(迭代删除)

二叉搜索树(Binary Search Tree,简称 BST)是一种常见的数据结构,它的特点是每个节点的左子树中的节点值小于它自身的值,右子树中的节点值大于它自身的值,且每个子树也是一个二叉搜索树。

在 BST 中,删除节点是一项非常常见的操作,但是删除一个节点可能会影响整棵树的结构,因此需要特别小心。本篇文章主要介绍如何在 BST 中实现迭代删除节点的操作。

算法流程
  1. 首先,我们需要找到待删除的节点及其父节点,与插入节点类似,我们从根节点开始遍历 BST,直到找到待删除节点或者发现不存在该节点。

  2. 如果不存在该节点,直接返回。

  3. 如果待删除节点是叶子节点,直接删除该节点,然后修改其父节点指向该节点的指针为 NULL。

  4. 如果待删除节点有一个子节点,将其父节点指向该节点的指针指向该节点的子节点。

  5. 如果待删除节点有两个子节点,需要找到待删除节点的后继节点。后继节点是指比待删除节点的值大的最小节点,即待删除节点右子树中的最小节点。将后继节点的值复制到待删除节点,然后将后继节点删除。

  6. 重复以上步骤,直到删除所有待删除的节点。

代码实现

下面是基于 C++ 实现的迭代删除二叉搜索树节点的代码:

class TreeNode {
public:
    int val;
    TreeNode* left;
    TreeNode* right;

    TreeNode(int x) {
        val = x;
        left = NULL;
        right = NULL;
    }
};

class BST {
public:
    void deleteNode(int val) {
        TreeNode *cur = root, *parent = NULL;
        while (cur) {
            if (cur->val == val) break;
            parent = cur;
            if (val < cur->val) {
                cur = cur->left;
            } else {
                cur = cur->right;
            }
        }
        if (!cur) return;
        if (!cur->left && !cur->right) {
            if (!parent) {
                root = NULL;
            } else if (cur == parent->left) {
                parent->left = NULL;
            } else {
                parent->right = NULL;
            }
            delete cur;
        } else if (!cur->left) {
            if (!parent) {
                root = cur->right;
            } else if (cur == parent->left) {
                parent->left = cur->right;
            } else {
                parent->right = cur->right;
            }
            delete cur;
        } else if (!cur->right) {
            if (!parent) {
                root = cur->left;
            } else if (cur == parent->left) {
                parent->left = cur->left;
            } else {
                parent->right = cur->left;
            }
            delete cur;
        } else {
            TreeNode *succ = cur->right;
            while (succ->left) succ = succ->left;
            cur->val = succ->val;
            deleteNode(succ->val);
        }
    }

private:
    TreeNode* root;
};

其中,TreeNode 表示二叉搜索树中的节点,包含一个整数值、一个左子节点和一个右子节点。BST 表示二叉搜索树,包含一个根节点 root 和一个迭代删除节点的方法 deleteNode

deleteNode 方法中,首先遍历 BST 找到待删除节点及其父节点,然后分四种情况删除节点:

  1. 如果待删除节点是叶子节点,直接删除该节点,然后修改其父节点指向该节点的指针为 NULL。

  2. 如果待删除节点有一个子节点,将其父节点指向该节点的指针指向该节点的子节点。

  3. 如果待删除节点有两个子节点,需要找到待删除节点的后继节点。后继节点是指比待删除节点的值大的最小节点,即待删除节点右子树中的最小节点。将后继节点的值复制到待删除节点,然后将后继节点删除。

  4. 重复以上步骤,直到删除所有待删除的节点。

总结

迭代删除二叉搜索树节点是 BST 中比较复杂的操作之一,需要格外小心。实现时需要注意遍历 BST 找到待删除节点及其父节点,并分四种情况删除节点。我们可以通过迭代的方式实现删除操作,也可以使用递归的方式实现。在日常工作中,我们需要熟练掌握二叉搜索树及其相关操作,以便更好地应用于实际场景。