zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    我的第一个博客在博客园安家了,哈哈~欢迎大家光临
    JS未设置对象问题解决方案
    关于Oracle的优化
    USACO 1.2 Milking Cows
    C语言的文件操作 freopen
    USACO 1.2 Palindromic Squares
    USACO 1.1 Broken Necklace
    ACM征程再次起航!
    USACO 1.3 Barn Repair
    USACO 1.2 Transformations
  • 原文地址:https://www.cnblogs.com/George1994/p/10640292.html
Copyright © 2011-2022 走看看