450. 删除二叉搜索树中的节点
删除二叉搜索树中的节点
题目描述:
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
示例 1:
输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。
示例 2:
输入: root = [5,3,6,2,4,null,7], key = 0
输出: [5,3,6,2,4,null,7]
解释: 二叉树不包含值为 0 的节点
示例 3:
输入: root = [], key = 0
输出: []
提示:
节点数的范围 [0, 104].
-105 <= Node.val <= 105
节点值唯一
root 是合法的二叉搜索树
-105 <= key <= 105
进阶: 要求算法时间复杂度为 O(h),h 为树的高度。
思路:
时间复杂度:O(logn),空间复杂度O(1)
用递归做,想清楚了难度不是特别大
代码:
func deleteNode(root *TreeNode, key int) *TreeNode {
switch {
case root == nil:
return nil
case root.Val > key:
root.Left = deleteNode(root.Left, key)
case root.Val < key:
root.Right = deleteNode(root.Right, 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
}
代码效率:
执行用时:12 ms, 在所有 Go 提交中击败了68.22%的用户
内存消耗:6.8 MB, 在所有 Go 提交中击败了63.60%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!