450. 删除二叉搜索树中的节点

450. 删除二叉搜索树中的节点

题意

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

  1. 首先找到需要删除的节点;

  2. 如果找到了,删除它。

说明: 要求算法时间复杂度为 O(h),h 为树的高度。

解题思路

  • 找到要删除的结点以后,将该结点的值替换成左子树中的最右子结点的值,并且将替换后的结点删除;

  • 和上面类似,只不过是被右子树中的最左子结点替换;

实现

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

posted @ 2019-04-02 07:06  banananana  阅读(509)  评论(0编辑  收藏  举报