代码随想录二刷 | 二叉树| 删除二叉搜索树中的节点

代码随想录二刷 | 二叉树| 删除二叉搜索树中的节点

  • 题目描述
  • 解题思路
  • 代码实现

题目描述

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

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

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

首先找到需要删除的节点; 如果找到了,删除它。 说明: 要求算法时间复杂度为 O ( h ) O(h) O(h),h 为树的高度。

示例:
在这里插入图片描述

解题思路

递归三部曲

  1. 确定递归函数参数以及返回值
    参数:根节点与值key
    返回值:TreeNode*
    TreeNode* deleteNode(TreeNode* root, int key)
    
  2. 确定递归函数的终止条件
    遇到空就返回。
    if (root == nullptr) return root;
    
  3. 确定单层递归的逻辑
    情况一:没找到删除的节点,遍历到空节点直接返回
    情况二:找到删除的节点,左右孩子都为空,删除节点,返回NULL为根节点。
    情况三:找到删除的节点,删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点。
    情况四:找到删除的节点,删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点。
    情况五:找到删除的节点,左右孩子节点都不为空,则将删除节点的左子树头节点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
    if (root->val == key) {// 情况二、情况三if (root->left == nullptr) return root->right;// 情况四else if (root->right == nullptr) return root->left;// 情况五else {TreeNode* cur = root->right; // 找右子树最左面的节点while (cur->left != nullptr) {cur = cur->left;}cur->left = root->left; // 把要删除的节点的左子树放在cur的左孩子位置TreeNode* temp = root;// 保存一下rootroot = root->right; // 返回旧root的右孩子作为新rootdelete temp; // 释放内存return root;}
    }
    
    这里相当于把新的节点返回给上一层,上一层就要用 root->left 或者 root->right接住,代码如下:
    if (root->val > key) root->left = deleteNode(root->left, key);
    if (root->val < key) root->right = deleteNode(root->right, key);
    return root;
    

代码实现

class Solution {
public:TreeNode* deleteNode(TreeNode* root, int key) {if (root == nullptr) return root; // 情况一if (root->val == key) {// 情况二if (root->left == nullptr && root->right == nullptr) {delete root;return nullptr;} else if (root->left == nullptr) { // 情况三auto retNode = root->right;delete root;return retNode;} else if (root->right == nullptr) { // 情况四auto retNode = root->left;delete root;return retNode;} else { // 情况五TreeNode* cur = root->right; // 找右子树最左面的节点while (cur->left != nullptr) {cur = cur->left;}cur->left = root->left; // 把要删除的节点的左子树放在cur的左孩子的位置TreeNode* temp = root; // 把root节点保存一下root = root->right; // 返回旧root的右孩子作为新rootdelete temp; // 释放内存return root;}}if (root->val > key) root->left = deleteNode(root->left, key);if (root->val < key) root->right = deleteNode(root->right, key);}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/415999.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小蓝的漆房*

题目 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int t sc.nextInt();sc.nextLine();int[] res new int[t];for(int i0;i<t;i) {int ans Integer.MAX_VALUE;int n sc.nextInt();int k…

C语言基础语法跟练 day4

41、牛牛有一个半径为 r 的球&#xff0c;他想知道这个球的体积。 #include <stdio.h> #include<math.h> int main() {float r;scanf("%f",&r);float v (4.0/3)*3.14*pow(r,3);printf("%.2f",v);return 0; } 42、小乐乐比较懒惰&#x…

MySQL运维篇(二)主从复制

一、概述 主从复制是指将主数据库的 DDL 和 DML 操作通过 二进制日志 传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 MySQL 支持一台主库同时向多台从库进行复制&#xff0c; 从…

3d渲染农场有什么好处?为什么选择渲染农场?

3D渲染农场是专门用于3D图形制作的计算机集群&#xff0c;通常用来帮助电影、动画或视觉效果的渲染&#xff0c;它有什么好处为什么要选择它呢&#xff1f;这次我们一起来看看吧&#xff01; 1、时间效率 渲染农场能显著加快渲染速度&#xff0c;将原本需要数小时或数天的作业缩…

【车载HMI开发工具--EB GUIDE 与 Unity 合作提供一体化的沉浸式 HMI 设计开发工具链】【转载】

随着车载高性能计算平台的日益普及以及显示器尺寸和数量的不断增加&#xff0c;沉浸式车载人机交互界面&#xff08;HMI&#xff09;的需求也在持续增长。为了将实时 3D 技术带入车载 HMI 领域&#xff0c;Unity 与 Elektrobit (EB)展开了合作&#xff0c;EB 是推进 HMI 功能安…

【Linux系统编程】程序地址空间

进程地址空间 进程地址空间是指每个进程在计算机内存中所占用的地址空间。地址空间是指能被访问的内存地址范围&#xff0c;它由若干个连续的内存块组成。每个进程都有自己的地址空间&#xff0c;这意味着每个进程都有自己的内存地址范围&#xff0c;不会与其他进程冲突。进程地…

CTF伪随机数爆破

要了解伪随机数的爆破首先你的先知道什么是PHP种子&#xff0c; 借用在rand()函数中&#xff0c;我们可以通过设置随机数种子来影响随机数的生成。例如&#xff0c;在rand()函数中加入了随机数种子编码后&#xff0c;每次运行程序将会生成同样的随机整数序列。这个就是伪随机数…

Redis实战之-分布式锁-redission

一、分布式锁-redission功能介绍 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&#xff0c;可重入锁的意义在于防止死锁&#xff0c;比如HashTable这样的代码中&#xff0c;他的方法都…

计算机网络编程

网络编程 文章目录 网络编程1 计算机网络1.1 什么是网络1.2 什么是计算机网络1.3 计算机网络发展的四个阶段 2 常用名词2.1 网络模型2.1.1 OSI模型2.1.2 TCP/IP模型 2.2 网络协议2.2.1 TCP/UDP2.2.2 IP 2.3 Port: 端口号 3 计算机网络编程3.1 InetAddress类3.2 基于TCP的Socket…

【C++】std::string 转换成非const类型 char* 的三种方法记录

std::string 有两个方法&#xff1a;data() 和 c_str()&#xff0c;都是返回该字符串的const char类型&#xff0c;那如何转换成非const的char呢&#xff1f; 下面展示三种方法&#xff1a; 强转&#xff1a;char* char_test (char*)test.c_str();使用string的地址&#xff…

Kubernetes的minikube

文章目录 环境概述准备安装启动和集群交互dashboard创建deployment创建service启用addon清理参考 环境 RHEL 9.3Docker Community 24.0.7miniKube v1.32.0 概述 minikube可以快速的在macOS、Linux和Windows上搭建本地的Kubernetes集群&#xff0c;帮助Kubernetes小白快速上手…

cv 不能正常读取中文路径

之前一直以为是PyQT的getOpenFileNames方法不能读取中文路径的。多次尝试后发现不是&#xff0c;是OpenCV的问题。 self.selected_imgPaths, _ QtWidgets.QFileDialog.getOpenFileNames(self, "打开图片", "./pending_images", "*.jpg;;*.JPG;;*.png…