📜  算法测验|须藤放置[1.6] |问题4(1)

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

算法测验须藤放置[1.6] - 问题4

本题要求实现一个二叉查找树中删除结点的函数。

什么是二叉查找树?

二叉查找树(Binary Search Tree,简称BST)是一种特殊的二叉树,它的每个结点最多有两个子结点,并满足左子树的所有结点的值都小于当前结点的值,右子树的所有结点的值都大于当前结点的值。这个特殊性质使得BST可以快速实现查找、插入和删除结点等操作。

二叉查找树中删除结点的原理

对于要删除的结点,如果其没有子结点(即为叶子结点),只需要将其父结点指向它的指针指向空即可。

如果要删除的结点只有一个子结点,则将其父结点指向它的指针指向其子结点即可。

如果要删除的结点有两个子结点,则需要找到其右子树中最小的结点(该结点一定没有左子树),然后用该结点值替换要删除的结点的值,并将该结点删除。

实现二叉查找树中删除结点的代码

本题要求实现删除BST中指定值的结点的函数deleteNode。

以下是该函数的代码实现:

def deleteNode(root, key):
    if not root:
        return None # 如果树为空,直接返回
    if root.val == key:
        if not root.left:
            return root.right
        if not root.right:
            return root.left
        temp = root.right
        while temp.left:
            temp = temp.left
        root.val = temp.val
        root.right = deleteNode(root.right, temp.val)
    elif root.val > key:
        root.left = deleteNode(root.left, key)
    else:
        root.right = deleteNode(root.right, key)
    return root

上述代码中,我们先判断要删除的结点是否为空或者是否为根结点。如果是根结点,则要找到其右子树中最小的结点。如果要删除的结点只有一个子结点,则直接用其子结点替换要删除的结点。如果要删除的结点有两个子结点,则用其右子树中最小的结点的值替换要删除的结点的值,并递归删除该最小结点。

总结

二叉查找树是一种常见的数据结构,在实际的算法应用中非常常见。掌握删除BST结点的方法对于算法工程师来说也是非常重要的。本文介绍了BST中删除结点的原理,并给出了具体的代码实现。