leetcode 450. delete-node-in-a-bst 刪除二叉搜尋樹中的節點 python3
時間: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)
總結:
-
這道題即使有思路也寫不出來,涉及遞迴我就有點懵
思路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)
總結:
-
簡直厲害了
相關文章
- 二叉搜尋樹如何刪除節點
- 程式碼隨想錄演算法訓練營day22 | leetcode 235. 二叉搜尋樹的最近公共祖先、701. 二叉搜尋樹中的插入操作、450. 刪除二叉搜尋樹中的節點演算法LeetCode
- 程式碼隨想錄演算法訓練營第22天 |二叉樹part07:235. 二叉搜尋樹的最近公共祖先、701.二叉搜尋樹中的插入操作、450.刪除二叉搜尋樹中的節點演算法二叉樹
- 程式碼隨想錄演算法訓練營day19| 235. 二叉搜尋樹的最近公共祖先 701.二叉搜尋樹中的插入操作 450.刪除二叉搜尋樹中的節點演算法
- 程式碼隨想錄演算法訓練營第19天|235. 二叉搜尋樹的最近公共祖先 ,701.二叉搜尋樹中的插入操作,450.刪除二叉搜尋樹中的節點演算法
- 程式碼隨想錄演算法訓練營第二十二天 | 235.二叉搜尋樹的最近公共祖先 701.二叉搜尋樹中的插入操作 450.刪除二叉搜尋樹中的節點演算法
- 22天【程式碼隨想錄演算法訓練營34期】第六章 二叉樹part08 (● 235. 二叉搜尋樹的最近公共祖先 ● 701.二叉搜尋樹中的插入操作 ● 450.刪除二叉搜尋樹中的節點)演算法二叉樹
- 二分搜尋樹系列之[ 節點刪除 (remove) ]REM
- 二分搜尋樹系列之「 節點刪除 (remove) 」REM
- Java中在二叉搜尋樹中查詢節點的父節點Java
- Leetcode 700. 二叉搜尋樹中的搜尋(DAY 2)LeetCode
- Java實現二叉搜尋樹的插入、刪除Java
- leetcode 700. 二叉搜尋樹中的搜尋 思考分析LeetCode
- 783. 二叉搜尋樹節點最小距離
- LeetCode-096-不同的二叉搜尋樹LeetCode
- 實現二叉搜尋樹的新增,查詢和刪除(JAVA)Java
- 程式碼隨想錄演算法訓練營第十七天|leetcode654. 最大二叉樹、leetcode617.合併二叉樹、leetcode700.二叉搜尋樹中的搜尋、leetcode98.驗證二叉搜尋樹演算法LeetCode二叉樹
- [leetCode]95. 不同的二叉搜尋樹 IILeetCode
- LeetCode-095-不同的二叉搜尋樹 IILeetCode
- leetcode----刪除連結串列中的節點LeetCode
- LeetCode-230-二叉搜尋樹中第K小的元素LeetCode
- Leetcode230. 二叉搜尋樹中第K小的元素LeetCode
- 每日一練(26):二叉搜尋樹的第k大節點
- LeetCode 95 | 構造出所有二叉搜尋樹LeetCode
- LeetCode98. 驗證二叉搜尋樹LeetCode
- LeetCode-098-驗證二叉搜尋樹LeetCode
- LeetCode-099-恢復二叉搜尋樹LeetCode
- 【LeetCode】98. 驗證二叉搜尋樹LeetCode
- LeetCode-173-二叉搜尋樹迭代器LeetCode
- leetcode 235. 二叉搜尋樹的最近公共祖先LeetCode
- leetcode-1382. 將二叉搜尋樹變平衡LeetCode
- 【ALGO】Leetcode 98.驗證二叉搜尋樹GoLeetCode
- dfs 驗證搜尋二叉樹——leetcode98二叉樹LeetCode
- LeetCode——671. 二叉樹中第二小的節點LeetCode二叉樹
- 二叉搜尋樹
- 【LeetCode二叉樹#17】在二叉搜尋樹中插入或刪除某個值(涉及重構二叉樹、連結串列基礎、以及記憶體洩漏問題)LeetCode二叉樹記憶體
- Day20 | 654.最大二叉樹 、 617.合併二叉樹 、 700.二叉搜尋樹中的搜尋 98.驗證二叉搜尋樹二叉樹
- Leetcode刷題筆記 501. 二叉搜尋樹中的眾數LeetCode筆記