题目链接:https://leetcode-cn.com/problems/delete-node-in-a-bst/
难度:中等
描述:
给定一个二叉搜索树的根节点 root
和一个值 key
,删除二叉搜索树中的 key
对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
题解
思路:
这里就简单地把待删除结点node
的左子树放到node
的后继下,而不是采用CLRS中用node
的后继来代替node
的做法。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
if root is None:
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:
# 右子节点为空也行
if root.left is None:
return root.right
elif root.right is None:
return root.left
else:
temp = root.right
# 找到root的后继
while temp.left is not None:
temp = temp.left
temp.left = root.left
return root.right
return root