30_删除二叉搜索树中的节点

简介: 30_删除二叉搜索树中的节点

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

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

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

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。

示例 1:

输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。

示例 2:

输入: root = [5,3,6,2,4,null,7], key = 0
输出: [5,3,6,2,4,null,7]
解释: 二叉树不包含值为 0 的节点

示例 3:

输入: root = [], key = 0
输出: []

递归法

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        //当前节点不存在,找不到key,直接返回null
        if (root == null)
            return null;
        if (root.val == key) {  //找到了待删除的节点的值
            //情形一:待删除节点的左右孩子都为null,这一层直接返回null
            if (root.left == null && root.right == null) {
                return null;
            //情形二:待删除节点的左孩子不为null,右孩子为null,这一层直接返回root.left
            } else if (root.left != null && root.right ==null) {
                return root.left;
            //情形三:待删除节点的左孩子为null,右孩子不为null,这一层直接返回root.right
            }  else if (root.left == null && root.right != null) {
                return root.right;
            } else {
                //情形四:待删除节点的左右孩子都不为空,让右孩子作为新的根节点,让右孩子的最左下的节点指向root.left(待删除节点的左子树)
                TreeNode cur = root.right;
                while (cur.left != null) {
                    cur = cur.left;
                }
                cur.left = root.left;
                //这里是返回原来待删除节点的右孩子节点,而不是cur,cur在遍历过程中已经变了
                return root.right;
            }
        }
        if (root.val < key) root.right = deleteNode(root.right, key);
        if (root.val > key) root.left = deleteNode(root.left, key);
        return root;
    }
}
相关文章
|
机器学习/深度学习 算法 Shell
【实操:人脸矫正】两次定位操作解决人脸矫正问题
【实操:人脸矫正】两次定位操作解决人脸矫正问题
483 0
|
移动开发 关系型数据库 PostgreSQL
PostgreSQL 条件判断函数
PostgreSQL 条件判断函数
1058 1
|
2月前
|
存储 人工智能 API
AI代理性能提升实战:LangChain+LangGraph内存管理与上下文优化完整指南
在AI代理系统开发中,上下文工程成为提升系统性能的关键技术。本文探讨了从提示工程到上下文工程的转变,强调其通过为AI系统提供背景信息和工具支持,显著提升智能化程度和实用价值。文章系统分析了上下文工程的理论基础、核心策略(如写入、选择、压缩和隔离),并结合LangChain和LangGraph工具,展示了如何实现上下文工程技术以优化AI代理性能。通过Scratchpad机制、内存管理、RAG系统集成、多代理架构及沙盒环境等技术手段,开发者可以更高效地构建高性能、可扩展的AI系统。
237 0
AI代理性能提升实战:LangChain+LangGraph内存管理与上下文优化完整指南
|
2月前
|
存储 人工智能 前端开发
从零构建智能对话助手:LangGraph + ReAct 实现具备记忆功能的 AI 智能体
本文系统介绍了基于 LangGraph 框架构建具备记忆能力的 ReAct(Reasoning + Action)智能体的技术实现方法。ReAct 智能体结合语言模型的推理能力与外部工具的执行能力,通过“思考-行动-观察”循环机制,实现复杂任务的自主处理。文章详细讲解了 LangGraph 的图结构设计、状态管理、工具集成与记忆系统等关键技术,并通过代码示例演示了从基础工作流到高级智能体系统的构建过程。最终实现的智能体具备多轮对话、工具调用、结果反馈与上下文记忆能力,为开发下一代智能应用提供了技术基础。
414 1
|
3月前
|
人工智能 运维 Serverless
语音生成+情感复刻,Cosyvoice2.0 极简云端部署
语音合成技术正快速发展,广泛应用于智能座舱、儿童教育等领域。CosyVoice2凭借多语言生成、零样本生成等优势,成为企业优选。然而,企业仍面临GPU算力依赖、部署运维复杂及成本高等挑战。阿里云函数计算Function AI推出Serverless化语音合成方案,支持CosyVoice2一键部署与弹性扩容,简化调试与运维流程,显著降低成本,助力企业高效落地AI语音应用。
448 18
|
9月前
|
PyTorch Shell API
Ascend Extension for PyTorch的源码解析
本文介绍了Ascend对PyTorch代码的适配过程,包括源码下载、编译步骤及常见问题,详细解析了torch-npu编译后的文件结构和三种实现昇腾NPU算子调用的方式:通过torch的register方式、定义算子方式和API重定向映射方式。这对于开发者理解和使用Ascend平台上的PyTorch具有重要指导意义。
|
10月前
|
机器学习/深度学习 供应链 安全
使用Python实现智能食品供应链管理的深度学习模型
使用Python实现智能食品供应链管理的深度学习模型
299 3
|
10月前
|
存储 UED 开发者
Flutter鸿蒙版本灵活使用方法间的回调处理复杂化的逻辑
在 Flutter 开发中,灵活使用函数回调可以提高代码的可重用性、简化异步编程、增强解耦设计和提升用户体验。本文通过一个简单的示例,展示了如何在 Flutter 中实现函数调用和回调的基本使用。示例代码包括主入口、页面组件和回调函数的定义与调用,详细解析了每个部分的功能和作用。通过这种方式,开发者可以在操作完成后执行特定逻辑,使代码更易读和维护。
207 0
|
关系型数据库 MySQL 分布式数据库
PolarDB-X最佳实践系列(三):如何实现高效的分页查询
分页查询是数据库中常见的操作。本文将介绍,如何在数据库中(无论是单机还是分布式)高效的进行翻页操作。
113192 10
PolarDB-X最佳实践系列(三):如何实现高效的分页查询
|
关系型数据库 MySQL
9. Mysql 模糊查询和正则表达式
9. Mysql 模糊查询和正则表达式
302 1