📅  最后修改于: 2023-12-03 14:58:26.514000             🧑  作者: Mango
本题为 GATE-CS-2005 题库中的第63题,属于计算机科学领域。该题目要求编写一个程序,实现从二叉搜索树中删除节点的操作。程序需满足复杂度为 $O(h)$,其中 $h$ 为树的高度。
由于二叉搜索树的特殊性质,为了维持搜索树的有序性,删除节点需要进行一定的调整操作。具体思路如下:
以上三种情况均可以通过递归的方式实现。在递归过程中,需要注意保持二叉搜索树的有序性。
实现代码如下:
class Node:
def __init__(self, val=None, left=None, right=None):
self.val = val
self.left = left
self.right = right
def deleteNode(root, key):
# 如果树为空,返回None
if root is None:
return root
# 递归搜索目标节点
if key < root.val:
root.left = deleteNode(root.left, key)
elif key > root.val:
root.right = deleteNode(root.right, key)
else: # 找到目标节点
# 情况1:如果目标节点为叶子节点,直接删除
if root.left is None and root.right is None:
root = None
# 情况2:如果目标节点只有一个子节点,将该子节点替换目标节点
elif root.left is None:
root = root.right
elif root.right is None:
root = root.left
# 情况3:如果目标节点有两个子节点
else:
# 找到右子树的最小节点
minNode = findMin(root.right)
# 将该最小节点的值赋给目标节点
root.val = minNode.val
# 删除右子树中的该最小节点
root.right = deleteNode(root.right, minNode.val)
return root
def findMin(node):
# 左子树为空,则当前节点为最小
if node.left is None:
return node
# 否则递归搜索左子树
return findMin(node.left)
本题中,我们学习了如何实现从二叉搜索树中删除节点的操作。需要注意递归过程中保持有序性,以及如何处理三种不同情况。同时,我们也通过本题熟悉了递归操作和树的遍历。