📅  最后修改于: 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)。所以对于一个平衡的树来说,这个方法还是不错的;但是对于不平衡的树来说,建议使用其他方法。