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

  • 相关阅读:
    解决Error: Cannot find module 'node-sass'问题
    SourceTree免登录使用
    git commit之后,想撤销commit
    vue生命周期
    Azure DevOps Azure Repos Git How-to Guides Use SSH key authentication
    FlagsAttribute Class
    serilog Debugging and Diagnostics
    Configuration error of serilog
    Serilog settings appsetting 配置的加载
    Kibana Query Language
  • 原文地址:https://www.cnblogs.com/George1994/p/10640292.html
Copyright © 2011-2022 走看看