450. 删除二叉搜索树中的节点
题意
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
解题思路
找到要删除的结点以后,将该结点的值替换成左子树中的最右子结点的值,并且将替换后的结点删除;
和上面类似,只不过是被右子树中的最左子结点替换;
实现
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