当前位置: 首页 > article >正文

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

450. 删除二叉搜索树中的节点
在这里插入图片描述

思路

根据题目定义,递归方法要返回将key节点删除后的根节点,可能是原根节点,也可能不是
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
那么递归终止条件就有2种:

  1. 没找到节点,比如遍历到空节点就算没找到节点,直接将None返回给上一层递归
  2. 找到了节点,返回当前递归层中新的根节点
    找到节点后,节点可能是以下几种情况:
    a. 左右子节点都没,直接返回None(因为要删除这个节点,返回None给上一层,上一层root.left=None 或者上一层root.right=None)
    b. 有左子节点没有右子节点,直接吧左节点当成当前节点,返回root.left
    c. 有右子节点没有左子节点,返回root.right
    d. 左右子节点都有,根据二叉搜索树任意一个左边的节点 一定比任意一个右边节点小的特性,把root.right替换root,把root.left指向root.right的最左边的节点(root.right最左边的节点就是root.right这棵树中最小的节点)

单层递归要做的事:
key在root右边,去右子树递归,返回左子树将key节点删除后的根节点
key在root左边,去左子树递归,返回右子树将key节点删除后的根节点

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
   def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
       # 找到这个节点,删除节点,返回删除后的根节点
       # 递归方法返回:返回将二叉树的值为key的节点删除后的根节点
       # 递归终止条件:1. root=None时应该返回上一层递归 2.找到该节点后节点删除,删除就是要return处理过的新的根节点
       if not root:
           return None
       if root.val == key:
           # 找到节点
           if not root.left and not root.right:
               return None
           elif root.left and not root.right:
               return root.left
           elif not root.left and root.right:
               return root.right
           else:
               # 根据二叉搜索树任意一个左边的节点 一定比任意一个右边节点小的特性,把让root.right替换root,把root.left指向root.right的最左边的节点
               cur = root.right
               while cur.left:
                   cur = cur.left
               cur.left = root.left
               return root.right

       # 返回左子树的根节点和右子树的根节点
       if root.val > key:
           root.left = self.deleteNode(root.left, key)
       if root.val < key:
           right_node = self.deleteNode(root.right, key)
       return root

http://www.kler.cn/a/287743.html

相关文章:

  • 使用 Go 实现将任何网页转化为 PDF
  • 录的视频怎么消除杂音?从录制到后期的杂音消除攻略
  • 某某科技笔试题
  • 结构化需求分析与设计
  • cocosCreator视频web模式播放踩坑解决
  • 深入List集合:ArrayList与LinkedList的底层逻辑与区别
  • 跟李沐学AI:序列模型
  • STM32单片机和ARM有什么区别?
  • vue之函数式组件
  • git diff命令详解
  • golang私有仓库遇到的问题记录
  • 【python因果推断库1】协方差分析(ANCOVA)用于处理前/后非等效组设计
  • 对称密码学
  • ncnn之resnet图像分类网络模型部署
  • 千千蓝鲸 回文数求和(高精度运算)
  • ADAS汽车芯片LPDDR4 SIPI联合仿真案列
  • GLM大模型 - CogVideoX:5B 开源,2B 转为 Apache 协议
  • 红帽认证初级有用吗?对个人帮助,报名时间分享
  • 如何为零售行业构建有效的勒索病毒防御体系
  • git branch 不显示分支名称
  • 速盾:便宜的高防 CDN 推荐,高防 CDN 能抵御 DDoS 吗?
  • es相关概念、索引操作(相当于mysql中的数据库操作)
  • Altium designer设计经验谈——常用规则的使用(二)
  • Mysql基础练习题 610.判断三角形 (力扣)
  • 力扣SQL仅数据库(570-579)
  • 5个常见问答 | 1+X证书《大数据应用开发(Python)》