给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
func deleteNode(root *TreeNode, key int) *TreeNode {
switch {
case root == nil:
return nil
case root.Val < key:
root.Right = deleteNode(root.Right, key)
case root.Val > key:
root.Left = deleteNode(root.Left, key)
case root.Left == nil || root.Right == nil:
if root.Left != nil {
return root.Left
}
return root.Right
default:
successor := root.Right
for successor.Left != nil {
successor = successor.Left
}
successor.Right = deleteNode(root.Right, successor.Val)
successor.Left = root.Left
return successor
}
return root
}