时间:2020-9-23
题目地址:https://leetcode-cn.com/problems/delete-node-in-a-bst/
题目难度:Medium
题目描述:
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
示例:
root = [5,3,6,2,4,null,7]
key = 3
5
/ \
3 6
/ \ \
2 4 7
给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
5
/ \
4 6
/ \
2 7
另一个正确答案是 [5,2,6,null,4,null,7]。
5
/ \
2 6
\ \
4 7
思路1:二叉搜索树的性质
1. 如果目标节点没有子节点,我们可以直接移除该目标节点。
2. 如果目标节只有一个子节点,我们可以用其子节点作为替换。
3. 如果目标节点有两个子节点,我们需要用其中序后继节点或者前驱节点来替换,再删除该目标节点。
代码段1:通过
# 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: TreeNode, key: int) -> TreeNode:
def delete(node, key):
if not node:
return None
if node.val > key:
node.left = delete(node.left, key)
elif node.val < key:
node.right = delete(node.right, key)
else:
if node.right == None and node.left == None:
node = None
elif node.right != None:
swap2 = node.right
while swap2.left:
swap2 = swap2.left
node.val = swap2.val
node.right = delete(node.right, node.val)
else:
swap2 = node.left
while swap2.right:
swap2 = swap2.right
node.val = swap2.val
node.left = delete(node.left, node.val)
return node
return delete(root, key)
总结:
-
这道题即使有思路也写不出来,涉及递归我就有点懵
2021-02-02
通过
# 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: TreeNode, key: int) -> TreeNode:
def getMax(root):
while(root.right):
root = root.right
return root
if root == None:
return None
if(root.val == key):
if root.left == None: return root.right
if root.right == None: return root.left
temp = getMax(root.left)
root.val = temp.val
#temp = None
root.left = self.deleteNode(root.left, temp.val)
if root.val > key:
root.left = self.deleteNode(root.left, key)
if root.val < key:
root.right = self.deleteNode(root.right, key)
return root
总结:
-
labuladong的文章看了,也写不出来。。我。。看看我犯的错误,temp = None??
思路2:和1一样,是一种简洁的写法
代码段2:通过
# 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: TreeNode, key: int) -> TreeNode:
def delete(node, key, l):
if not node:
return l
if node.val > key:
node.left = delete(node.left, key, l)
return node
elif node.val < key:
node.right = delete(node.right, key, l)
return node
else:
return delete(node.right, key, node.left)
return delete(root, key, None)
总结:
-
简直厉害了