67. Leetcode 450. 删除二叉搜索树中的节点 (二叉搜索树-基本操作类)
生活随笔
收集整理的這篇文章主要介紹了
67. Leetcode 450. 删除二叉搜索树中的节点 (二叉搜索树-基本操作类)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
給定一個二叉搜索樹的根節點 root 和一個值 key,刪除二叉搜索樹中的?key?對應的節點,并保證二叉搜索樹的性質不變。返回二叉搜索樹(有可能被更新)的根節點的引用。一般來說,刪除節點可分為兩個步驟:首先找到需要刪除的節點;
如果找到了,刪除它。示例 1:輸入:root = [5,3,6,2,4,null,7], key = 3
輸出:[5,4,6,2,null,null,7]
解釋:給定需要刪除的節點值是 3,所以我們首先找到 3 這個節點,然后刪除它。
一個正確的答案是 [5,4,6,2,null,null,7], 如下圖所示。
另一個正確答案是 [5,2,6,null,4,null,7]。示例 2:輸入: root = [5,3,6,2,4,null,7], key = 0
輸出: [5,3,6,2,4,null,7]
解釋: 二叉樹不包含值為 0 的節點
示例 3:輸入: root = [], key = 0
輸出: []# 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: Optional[TreeNode], key: int) -> Optional[TreeNode]:if root is None:return None# 遞歸調用左子樹if key < root.val:root.left = self.deleteNode(root.left, key)return root# 遞歸調用右子樹if key > root.val:root.right = self.deleteNode(root.right, key)return root# 當前節點的val正好等于key# 當前節點的左子節點不存在,直接提升右子節點即可if root.left is None:new_root = root.rightroot.right = Nonereturn new_root# 當前節點右子節點不存在,直接提升左子節點即可if root.right is None:new_root = root.leftroot.left = Nonereturn new_root# 當前節點的左右子節點均存在,用左子樹的最大點替換# 尋找左子樹最大的點node = root.leftwhile node.right != None:node = node.right# 左子樹最大的點變更為根節點new_root = TreeNode(node.val)# 新的根節點需要左子樹需要更新new_root.left = self.removeMax(root.left)# 新的根節點的右子樹即為原來的右子樹new_root.right = root.rightroot.left = Noneroot.right = Nonereturn new_rootdef removeMax(self, node):if node.right == None:new_root = node.leftnode.left = Nonereturn new_rootnode.right = self.removeMax(node.right)return node
總結
以上是生活随笔為你收集整理的67. Leetcode 450. 删除二叉搜索树中的节点 (二叉搜索树-基本操作类)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 65. Leetcode 153. 寻找
- 下一篇: 68. Leetcode 669. 修剪