📅  最后修改于: 2023-12-03 15:42:15.066000             🧑  作者: Mango
本文介绍了 GATE-CS-2001
题目集中的问题18。此问题需要你实现一个函数,可以从二叉搜索树中删除一个节点。
为了解决这个问题,我们需要考虑以下几个方面:
当删除叶节点时:只需将其父节点对应的左/右指针指向空即可。
当删除仅有一个子节点的节点时:只需将其父节点对应的左/右指针指向其子节点即可。
当删除拥有两个子节点的节点时:需要找到该节点的中序后继节点(即比该节点大的最小节点),用后继节点替换该节点。
实现代码如下:
# 定义节点结构体
class TreeNode():
def __init__(self, val = None, left=None, right=None):
self.val = val
self.left = left
self.right = right
# 在二叉搜索树中删除一个节点
def delete_node(root, key):
# 如果根节点为空,直接返回None
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.left:
return root.right
# 当前节点没有右子树,直接返回左子树
elif not root.right:
return root.left
# 当前节点有左右子树
else:
# 找到当前节点的中序后继节点
# 中序后继节点为右子树中最小的节点
successor = root.right
while successor.left:
successor = successor.left
# 将后继节点的值复制到当前节点
root.val = successor.val
# 删除后继节点
root.right = delete_node(root.right, successor.val)
return root
本文介绍了 GATE-CS-2001
题目集中的问题18。该问题要求我们实现一个函数,可以从二叉搜索树中删除一个节点。我们介绍了删除叶节点、删除仅有一个子节点的节点、删除拥有两个子节点的节点三种情况,并提供了相应的代码实现。