leetcode 450 刪除二叉搜尋樹中的節點

2021-10-09 12:23:06 字數 2290 閱讀 9121

給定乙個二叉搜尋樹的根節點 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對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。說明 要求演算法時間複雜度為 ...