📜  线程二进制搜索树|删除中(1)

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

线程二进制搜索树的删除操作

在介绍线程二进制搜索树的删除操作之前,我们先了解下线程二进制搜索树的基本知识点。

线程二进制搜索树

线程二进制搜索树是一种相对于标准二叉搜索树来说,增加了"线程"概念的搜索树。在一棵线程二叉树中,每个结点都有一个指向其在"中序遍历后继"的线索。线索的实现可以有左线索和右线索。左线索为1时指向该结点在中序遍历中的前驱,右线索为1时指向该结点在中序遍历中的后继。

线程二叉搜索树最大的优点是可以不用递归或用堆栈来实现中序遍历,可以快速地找到该结点的前驱或后继。

删除操作

线程二叉搜索树的删除操作与普通二叉搜索树的删除操作类似,不同在于操作后还需要更新线索指向。

删除操作分四种情况:

  1. 要删除的结点没有子结点。 直接删除该结点,将其前驱后继指向该节点的线索改为NULL。

  2. 要删除的结点只有一个子结点。 直接将该结点的子结点替换为该结点,并将该结点的线索指向其前驱后继的线索值,用于连接前驱后继的线索。

  3. 要删除的结点有两个子结点,该结点前驱的子结点也有两个子结点。 将该结点前驱的值替换到该结点,然后删除该结点前驱。

  4. 要删除的结点有两个子结点,该结点前驱的子结点只有一个子结点。 将该结点前驱的值替换到该结点,然后删除该结点前驱。

具体代码如下:

Node* deleteNode(Node* root, int key) {
    if (!root) return root;

    if (root->val > key)
        root->left = deleteNode(root->left, key);
    else if (root->val < key)
        root->right = deleteNode(root->right, key);
    else {
        if (!root->left) {
            Node* tmp = root->right;
            delete root;
            return tmp;
        }
        else if (!root->right) {
            Node* tmp = root->left;
            delete root;
            return tmp;
        }

        Node* tmp = root->left;
        while (tmp->right)
            tmp = tmp->right;

        root->val = tmp->val;
        root->left = deleteNode(root->left, tmp->val);
    }
    return root;
}

以上就是线程二进制搜索树的删除操作相关内容。