450. 刪除二叉搜索樹中的節點

450. 刪除二叉搜索樹中的節點

題意

給定一個二叉搜索樹的根節點 root 和一個值 key,刪除二叉搜索樹中的 key 對應的節點,並保證二叉搜索樹的性質不變。返回二叉搜索樹(有可能被更新)的根節點的引用。node

通常來講,刪除節點可分爲兩個步驟:web

  1. 首先找到須要刪除的節點;算法

  2. 若是找到了,刪除它。ide

說明: 要求算法時間複雜度爲 O(h),h 爲樹的高度。spa

解題思路

  • 找到要刪除的結點之後,將該結點的值替換成左子樹中的最右子結點的值,而且將替換後的結點刪除;code

  • 和上面相似,只不過是被右子樹中的最左子結點替換;orm

實現

class Solution(object):
   def deleteNode(self, root, key):
       """
      :type root: TreeNode
      :type key: int
      :rtype: TreeNode
      """
       if not root:
           return root
       
       # 從左子樹中找
       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:
               return root.right
           elif not root.right:
               return root.left
           else:
            # 找到左子樹的最右子結點
               tmp = root.left
               while tmp.right:
                   tmp = tmp.right
               root.val = tmp.val
               # 刪除左子樹的最右子結點後,重構左子樹
               root.left = self.deleteNode(root.left, tmp.val)
       return root
     
def deleteNode(self, root, key):
       """
      :type root: TreeNode
      :type key: int
      :rtype: TreeNode
      """
       if not root:
           return root
       
       if root.val > key:
           root.left = self.deleteNode(root.left, key)
           return root
       elif root.val < key:
           root.right = self.deleteNode(root.right, key)
           return root

       if not root.left:
           return root.right
       elif not root.right:
           return root.left
       
       tmp = self.findmin(root.right)
       tmp.right = self.delmin(root.right)
       tmp.left = root.left
       return tmp
   
   def findmin(self, root):
    """
    找到右子樹中的最左子結點
    """
       if not root.left:
           return root
       return self.findmin(root.left)
   
   def delmin(self, root):
    """
    刪除右子樹中的最左子結點
    """
       if not root.left:
           return root.right
       
       root.left = self.delmin(root.left)
       return root
相關文章
相關標籤/搜索