题目
解题思路
删除二叉搜索树中结点分为三种情况:
- 删除结点为叶子结点 - 直接删除结点即可
- 删除结点只有一个子节点 - 用子节点代替被删除结点
- 删除的结点有左右结点
· 用左子树的最右结点A(也就是左子树中最大的结点)代替被删除结点,在树中删除结点A。
· 用右子树的最左结点B(右子树中最小的结点)代替被删除结点,在树中删除结点B。
可以发现当被删除结点有两个子节点时,其处理过程中又嵌套了一个删除操作,所以整个流程可以采用递归来完成。
代码实现
class Solution:
def deleteNode(self, root: TreeNode, key: int) -> TreeNode:
if not root:
return None
# 在左子树中删除
if root.val > key:
root.left = self.deleteNode(root.left, key)
elif root.val < key:
root.right = self.deleteNode(root.right, key)
else:
# 找到了被删除的结点
# 如果没有子节点or只有一个子节点,直接用其取代被删除结点
if not root.left or not root.right:
root = root.left if root.left else root.right
# 如果左右都存在,用左子树中最右的or右子树中最左的来代替,然后删除代替结点
else:
node = root.left
while node.right:
node = node.right
root.val = node.val
root.left = self.deleteNode(root.left, root.val)
return root