给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。node
通常来讲,删除节点可分为两个步骤:web
首先找到须要删除的节点;算法
若是找到了,删除它。ide
说明: 要求算法时间复杂度为 O(h),h 为树的高度。spa
找到要删除的结点之后,将该结点的值替换成左子树中的最右子结点的值,而且将替换后的结点删除;code
和上面相似,只不过是被右子树中的最左子结点替换;orm
class Solution(object):
def deleteNode(self, root, key):
"""
:type root: TreeNode
:type key: int
:rtype: TreeNode
"""
if not root:
return root
# 从左子树中找
if root.val > key:
root.left = self.deleteNode(root.left, key)
# 从右子树中找
elif root.val < key:
root.right = self.deleteNode(root.right, key)
else:
# 判断是否左右子树是否都存在
if not root.left:
return root.right
elif not root.right:
return root.left
else:
# 找到左子树的最右子结点
tmp = root.left
while tmp.right:
tmp = tmp.right
root.val = tmp.val
# 删除左子树的最右子结点后,重构左子树
root.left = self.deleteNode(root.left, tmp.val)
return root
def deleteNode(self, root, key):
"""
:type root: TreeNode
:type key: int
:rtype: TreeNode
"""
if not root:
return root
if root.val > key:
root.left = self.deleteNode(root.left, key)
return root
elif root.val < key:
root.right = self.deleteNode(root.right, key)
return root
if not root.left:
return root.right
elif not root.right:
return root.left
tmp = self.findmin(root.right)
tmp.right = self.delmin(root.right)
tmp.left = root.left
return tmp
def findmin(self, root):
"""
找到右子树中的最左子结点
"""
if not root.left:
return root
return self.findmin(root.left)
def delmin(self, root):
"""
删除右子树中的最左子结点
"""
if not root.left:
return root.right
root.left = self.delmin(root.left)
return root