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

2023-11-18

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
来源:力扣(LeetCode)

题目分析

①.二叉搜索树的性质:左子树的节点值都小于根节点值;右子树的节点值都大于根节点值
②.若为叶子节点,则直接删除即可,不影响二叉搜索树的性质
③.若只有一个子树,则用子树取代本节点的位置,不影响二叉搜索树的性质
④.把左子树中的最大值的节点移出,并覆盖到当前节点,不影响二叉搜索树的性质
⑤.通过递归返回修改后的子树,用于更新树的连接关系

代码示例

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if( root == nullptr) return root;
        else if( key < root->val )//去左子树上删除,返回删除节点后的左子树
        {
            root->left = deleteNode(root->left,key);//更新连接关系
        }
        else if ( key > root->val )//去右子树上删除,返回删除节点后的右子树
        {
            root->right = deleteNode(root->right,key);//更新连接关系
        }
        else//删除本节点
        {
            if( root->right == nullptr && root->left == nullptr)//叶子节点,直接删除
            {
                delete root;//删除节点
                root = nullptr;
                return root;
            }
            else if( root->left != nullptr && root->right == nullptr) //只有左子树,用左子树取代本节点
            {
                TreeNode * left = root->left ;
                root->left = nullptr;//断开连接
                delete root;//删除节点
                root = nullptr;
                return left;
            }
            else if( root->right != nullptr && root->left == nullptr )//只有右子树,用右子树取代本节点
            {
                TreeNode * right = root->right ;
                root->right = nullptr;//断开连接
                delete root;//删除节点
                root = nullptr;
                return right;
            }
            else//左右子树都存在
            {
                //找左子树的最大值
                TreeNode * pre = root->left;
                while( pre->right != nullptr )
                {
                    pre = pre->right;
                }
                root->val = pre->val;//更新到当前节点
                root->left = deleteNode( root->left,root->val);//去左子树删除原先的节点
                return root;//返回自身
            }
        }
        return root;
    }
};

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode-450.删除二叉搜索树中的节点 的相关文章

随机推荐

  • chatgpt赋能python:Python除零错误:原因,解决办法和实践建议

    Python 除零错误 原因 解决办法和实践建议 介绍 Python 作为一门广泛使用的高级编程语言 它的强大之处就体现在它的简洁性 可读性和易用性上 但是在实践中 有时候我们会遇到一些让我们不得不头痛的问题 其中之一就是 Python 除
  • Eclipse如何设置快捷键

    在eclopse设置注释行和取消注释行 打开eclipse 依次打开 Window gt Preferences gt General gt Key
  • Vue<router-view></router-view>学习心得

    今天看到个Vue项目结构中使用到了
  • C#基础教程(十四) String、StringBuilder、”==,equal,ReferenceEquals“

    1 内存分区 1 栈区 由编译器自动分配释放 存放值类型的对象本身 引用类型的引用地址 指针 静态区对象的引用地址 指针 代码中必须就栈的大小有明确的定义 栈区内存无需我们管理 也不受GC管理 栈顶元素使用完毕弹出就会立即释放 由操作系统管
  • 【0基础】学习solidity开发智能合约-初识solidity

    本篇课程开始 我们来学习一下如何使用solidity开发智能合约 由于博主对于solidity的学习 也是自学的 所以一些不足或有纰漏之处还望指出 大家共同进步 本系列课程会分很多节课讲述 从入门到进阶 实战 在课程最后 我们会通过所学知识
  • 【Py】给已存在的Excel添加sheet

    使用pandas import pandas as pd from openpyxl import load workbook df pd DataFrame a 1 book load workbook test xlsx with pd
  • GPT专业应用:生成会议通知

    正文共 917 字 阅读大约需要 3 分钟 公务员 文秘必备技巧 您将在3分钟后获得以下超能力 快速生成会议通知 Beezy评级 B级 经过简单的寻找 大部分人能立刻掌握 主要节省时间 推荐人 Kim 编辑者 Linda 图片由Lexica
  • vue、nuxt的mavon-editor富文本的使用及添加代码块高亮样式、代码块行数、一键复制代码功能

    为啥断更了这么久 就是因为mavon editor富文本框的样式 nuxt项目的seo nuxt项目的优化 nuxt首屏渲染等等等的问题导致这么久没有发文章了 这篇文章先讲vue项目及nuxt项目中使用mavon editor并改变代码块的
  • HTTPS 的加密流程

    目录 一 HTTPS是什么 二 为什么要加密 三 加密 是什么 四 HTTPS 的工作过程 1 对称加密 2 非对称加密 3 中间人攻击 4 证书 总结 一 HTTPS是什么 HTTPS Hyper Text Transfer Protoc
  • BUUCTF-PWN-Writeup-1-5

    前言 开始刷一刷Buuctf的PWN题 一边学一边刷题了 其实主要是堆学的顶不住了 一个下午才搞懂一个知识点 太tm的难了 test your nc from pwn import from LibcSearcher import cont
  • 各大操作系统命令行清屏快捷键

    mac os x terminal清屏快捷键 cammand k linux系统清屏快捷键 ctrl l windows 命令行清屏命令 cls
  • 背景图片的定位问题详解

    我们在研究其他的网站的样式的时候经常会发现一种情况 就是在很多background属性里都调用同一张图片 来满足网页各个部分的使用 打开这种图片看一下 会发现这张图片上包含了很多小图片 比如 又如 这些小图片就是整图分割后的各个部分 把各个
  • Ubuntu16.04 获取Root 权限

    如果是第一次获得Root权限那么首先要设置root密码 sudo passwd root 获取root权限 su root 输入之前你设置的密码 退出root exit
  • Quartz教程--快速入门

    欢迎来到quartz快速入门教程 阅读本教程 你将会了解 quartz下载 quartz安装 根据你的需要 配置Quartz 开始一个示例应用 当熟悉了quratz调度的基本功能后 可以尝试一些更高级的特性 比如Where 这个一个企业级功
  • 深聊测试开发之:从订单支付流程来聊一聊,如何预防重复支付,建议收藏。

    如何预防订单重复支付 1 引言 2 订单支付流程 2 1 支付流程 2 2 订单状态 3 订单重复支付原因 3 1 掉单 3 2 未防重 3 3 多渠道 4 防止重复支付 4 1 加锁 4 2 缓存结果 4 3 支付中取消流水 4 4 已支
  • 微信小程序canvas画布绘制;canvas画布图片保存

    微信小程序canvas画布绘制 wx createSelectorQuery select canvas fields node true size true exec res gt let ctx res 0 node getContex
  • 关于域名暂时解析失败的问题 (Temporary failure in name resolution)

    相信很多小伙伴在运行爬虫程序的时候 都会遇到这么个错误 Temporary failure in name resolution 什么意思呢 昨天还运行的好好的呢 域名暂时解析失败 但是呢 在浏览器输入网址 还是可以打开这个网站的 看网站内
  • Win10开启高性能、卓越性能模式的方法

    Win10开启高性能 卓越性能模式的方法 一 老办法 1 打开PowerShell 管理员模式 Win X 选择 2 输入以下命令 powercfg duplicatescheme e9a42b02 d5df 448d aa00 03f14
  • MFC 动态链接库(DLL)中创建窗口失败

    毕业设计写一个关于网络的项目 在客户端把WSAAsyncSelect网络模型封装在了动态链接库中 点击运行 在UI线程中发现 创建一个CFrameWnd窗口的时候程序报错了 均显示ASSERT afxCurrentResourceHandl
  • LeetCode-450.删除二叉搜索树中的节点

    给定一个二叉搜索树的根节点 root 和一个值 key 删除二叉搜索树中的 key 对应的节点 并保证二叉搜索树的性质不变 返回二叉搜索树 有可能被更新 的根节点的引用 一般来说 删除节点可分为两个步骤 首先找到需要删除的节点 如果找到了