題目描述
給定一個二叉搜索樹的根節點 root 和一個值 key,刪除二叉搜索樹中的 key 對應的節點,並保證二叉搜索樹的性質不變。返回二叉搜索樹(有可能被更新)的根節點的引用。
一般來說,刪除節點可分爲兩個步驟:
首先找到需要刪除的節點;
如果找到了,刪除它。
說明: 要求算法時間複雜度爲 O(h),h 爲樹的高度。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/delete-node-in-a-bst
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
算法思路
二叉搜索樹的刪除操作是有一定複雜的,因爲刪除掉目標節點後需要維護二叉搜索樹的正確性。
這裏有兩種情況:
- 目標節點只有左子樹或只有右子樹
- 目標節點有兩個子樹
這裏比較難的是第二種情況,需要在目標節點下找到其左邊的最大值或右邊的最小值替代目標節點。
class Solution:
def deleteNode(self, root: TreeNode, key: int) -> TreeNode:
if not root:
return
if root.val>key:# 目標值在左子樹
root.left=self.deleteNode(root.left,key)
elif root.val<key: # 目標值在右子樹
root.right=self.deleteNode(root.right,key)
else:
if not root.left or not root.right:
root=root.left if root.left else root.right
else:
cur=root.right
# 查找其右邊的最小值
while cur.left:
cur=cur.left
root.val=cur.val
root.right=self.deleteNode(root.right,cur.val)
return root
執行用時 :96 ms, 在所有 Python3 提交中擊敗了48.33%的用戶
內存消耗 :18.1 MB, 在所有 Python3 提交中擊敗了14.29%的用戶
這一版算法來自評論區,簡潔優美,DIAO!
class Solution:
def deleteNode(self, root: TreeNode, key: int) -> TreeNode:
if not root:
return
if root.val>key:# 目標值在左子樹
root.left=self.deleteNode(root.left,key)
elif root.val<key: # 目標值在右子樹
root.right=self.deleteNode(root.right,key)
else:
if not root.left or not root.right:
root=root.left if root.left else root.right
else:
cur=root.left
# 查找其左邊的最大值
while cur.right:
cur=cur.right
root.val=cur.val
root.left=self.deleteNode(root.left,cur.val)
return root