leetcode 450. delete-node-in-a-bst 刪除二叉搜尋樹中的節點 python3

a_blooming_tree發表於2020-09-23

時間:2020-9-23

題目地址:https://leetcode-cn.com/problems/delete-node-in-a-bst/

題目難度:Medium

題目描述:

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


思路1:二叉搜尋樹的性質

1. 如果目標節點沒有子節點,我們可以直接移除該目標節點。
2. 如果目標節只有一個子節點,我們可以用其子節點作為替換。
3. 如果目標節點有兩個子節點,我們需要用其中序後繼節點或者前驅節點來替換,再刪除該目標節點。

程式碼段1:通過

# 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:
        def delete(node, key):
            if not node:
                return None
            if node.val > key:
                node.left = delete(node.left, key)
            elif node.val < key:
                node.right = delete(node.right, key)
            else:
                if node.right == None and node.left == None:
                    node = None
                elif node.right != None:
                    swap2 = node.right
                    while swap2.left:
                        swap2 = swap2.left
                    node.val = swap2.val
                    node.right = delete(node.right, node.val)
                else:
                    swap2 = node.left
                    while swap2.right:
                        swap2 = swap2.right
                    node.val = swap2.val
                    node.left = delete(node.left, node.val)
            return node
        return delete(root, key)

總結:

  1. 這道題即使有思路也寫不出來,涉及遞迴我就有點懵


思路2:和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:
        def delete(node, key, l):
            if not node:
                return l
            if node.val > key:
                node.left = delete(node.left, key, l)
                return node
            elif node.val < key:
                node.right = delete(node.right, key, l)
                return node
            else:
                return delete(node.right, key, node.left)

        return delete(root, key, None)

總結:

  1. 簡直厲害了

相關文章