📌  相关文章
📜  删除右侧值较大的节点(1)

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

删除右侧值较大的节点

在二叉搜索树中,可能会遇到要删除一个节点,但是我们希望删除的是右侧子树中的值较大的节点。这个问题的解决思路很简单,就是先遍历右侧子树找到最小的节点,然后把这个节点替换要删除的节点,再删除这个最小的节点,代码实现如下:

def delete_node(root, key):
    if not root:
        return None
    if key < root.val:
        root.left = delete_node(root.left, key)
    elif key > root.val:
        root.right = delete_node(root.right, key)
    else:
        if not root.right:
            return root.left
        if not root.left:
            return root.right
        temp = root.right
        while temp.left:
            temp = temp.left
        root.val = temp.val
        root.right = delete_node(root.right, temp.val)
    return root

这个代码中,删除节点的逻辑和普通的二叉搜索树删除节点的逻辑一样,只不过如果待删除的节点有右侧子树,我们需要找到右侧子树中值最小的节点,用它来替换要删除的节点,再把它删掉。

需要注意的是,这个方法虽然能够解决问题,但是效率不高。因为每次都要遍历右侧子树,所以时间复杂度是O(h),其中h是树的高度。如果树比较平衡,h≈logN,时间复杂度是O(logN);如果树很不平衡,h≈N,时间复杂度是O(N)。所以对于一个平衡的树来说,这个方法还是不错的;但是对于不平衡的树来说,建议使用其他方法。