給定一個二叉搜索樹的根節點 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