給定乙個二叉搜尋樹的根節點 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
找到要刪除的節點後,有3種可能:
該節點沒有孩子,直接刪除即可
該節點有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:
ifnot root:
return
ret_head = treenode(-1
) ret_head.left = root
# find target node
deque = collections.deque(
[(root, ret_head,
'l')])
while deque:
p, parent, direction = deque.popleft(
)if p.val == key:
break
if p.left:
(p.left, p,
'l')
)if p.right:
(p.right, p,
'r')
)if p.val != key:
return root
# delete nodeif(
not p.left)
and(
not p.right)
:if direction ==
'l':
parent.left =
none
else
: parent.right =
none
elif
(not p.left)or(
not p.right)
:if direction ==
'l':
parent.left = p.left if p.left else p.right
else
: parent.right = p.left if p.left else p.right
else
:# find right most node in p.left
left_right = p.left
while left_right.right:
left_right = left_right.right
left_right.right = p.right
if direction ==
'l':
parent.left = p.left
else
: parent.right = p.left
return ret_head.left
Leetcode 450 刪除二叉搜尋樹中的節點
給定乙個二叉搜尋樹的根節點root和乙個值key,刪除二叉搜尋樹中的key對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。說明 要求演算法時間複雜度為 o h h 為樹的高度。示例 r...
Leetcode 450 刪除二叉搜尋樹中的節點
給定乙個二叉搜尋樹的根節點root和乙個值key,刪除二叉搜尋樹中的key對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。說明 要求演算法時間複雜度為 o h h 為樹的高度。示例 r...
leetcode450 刪除二叉搜尋樹中的節點
450.刪除二叉搜尋樹中的節點 給定乙個二叉搜尋樹的根節點root和乙個值key,刪除二叉搜尋樹中的key對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。說明 要求演算法時間複雜度為 ...