题目
Given a root node reference of a BST and a key, delete the node with the given key in the BST. Return the root node reference (possibly updated) of the BST.
Basically, the deletion can be divided into two stages:
- Search for a node to remove.
- If the node is found, delete the node.
Follow up: Can you solve it with time complexity O(height of tree)
?
Example 1:
1 | Input: root = [5,3,6,2,4,null,7], key = 3 |
Example 2:
1 | Input: root = [5,3,6,2,4,null,7], key = 0 |
Example 3:
1 | Input: root = [], key = 0 |
Constraints:
- The number of nodes in the tree is in the range
[0, 10^4]
. -10^5 <= Node.val <= 10^5
- Each node has a unique value.
- root is a valid binary search tree.
-10^5 <= key <= 10^5
思路
- 被删除节点没有左子树:返回其右子树
- 被删除节点节点没有右子树:返回其左子树
- 被删除节点既有左子树,又有右子树:
1)查找到其右子树的最小值的节点,替换掉被删除的节点,并删除找到的最小节点
2)查找到其左子树的最大值的节点,替换掉被删除的节点,并删除找到的最大节点
下面的做法是查找右子树的最小值节点的方法,最小节点就是右子树中的最靠左边的节点。代码使用的递归,最核心的是找到该节点之后的操作,特别是把值进行交换一步很重要,因为我们并没有删除了该最小值节点,所以把最小值的节点赋值成要查找的节点,然后在之后的操作中将会把它删除。
代码
1 | # Definition for a binary tree node. |