給定乙個二叉搜尋樹的根節點
root
和乙個值
key
,刪除二叉搜尋樹中的
key
對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹(有可能被更新)的根節點的引用。
一般來說,刪除節點可分為兩個步驟:
首先找到需要刪除的節點;
如果找到了,刪除它。
說明:
要求演算法時間複雜度為 o(h),h 為樹的高度。
classsolution(object):
defdeletenode(self, root, key):
""":type root: treenode
:type key: int
:rtype: treenode
"""if
notroot:
return
root
# 從左子樹中找
ifroot.val
>
key:
root.left = self.deletenode(root.left, key)
# 從右子樹中找
elif
root.val
<
key:
root.right = self.deletenode(root.right, key)
else:
# 判斷是否左右子樹是否都存在
ifnot
root.left:
return
root.right
elif
notroot.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
defdeletenode(self, root, key):
""":type root: treenode
:type key: int
:rtype: treenode
"""if
notroot:
return
root
ifroot.val
>
key:
root.left = self.deletenode(root.left, key)
return
root
elif
root.val
<
key:
root.right = self.deletenode(root.right, key)
return
rootif
notroot.left:
return
root.right
elif
notroot.right:
return
root.left
tmp = self.findmin(root.right)
tmp.right = self.delmin(root.right)
tmp.left = root.left
return
tmpdef
findmin(self, root):
"""找到右子樹中的最左子結點
"""if
notroot.left:
return
root
return
self.findmin(root.left)
defdelmin(self, root):
"""刪除右子樹中的最左子結點
"""if
notroot.left:
return
root.right
root.left = self.delmin(root.left)
return
root
450 刪除二叉搜尋樹中的節點
給定乙個二叉搜尋樹的根節點 root 和乙個值 key,刪除二叉搜尋樹中的 key 對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。說明 要求演算法時間複雜度為 o h h 為樹的高度...
450 刪除二叉搜尋樹中的節點
刪除二叉搜尋樹中的節點 給定乙個二叉搜尋樹的根節點 root 和乙個值 key,刪除二叉搜尋樹中的 key 對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。說明 要求演算法時間複雜度為...
450 刪除二叉搜尋樹中的節點 遞迴
給定乙個二叉搜尋樹的根節點 root 和乙個值 key,刪除二叉搜尋樹中的 key 對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。示例 輸入 root 5,3,6,2,4,null,...