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

  • 相关阅读:
    linux下的磁盘挂载
    shell中的循环语句while
    hadoop安装和配置
    shell 命令 创建/删除 软连接 ln -s
    azkaban disable 停用部分工作流
    git dev 分支merge到master
    shell 命令 zip unzip
    git代码同步服务器代码需要注意的问题
    shell 命令 if elif else fi 用法
    python 引入本地 module
  • 原文地址:https://www.cnblogs.com/George1994/p/10640292.html
Copyright © 2011-2022 走看看