Day32——二叉树专题

news2024/10/2 8:26:16

文章目录

        • 28.删除二叉搜索树的节点
        • 29.修剪二叉搜索树
        • 30.将有序数组转换为二叉搜索树
        • 31. 把二叉搜索树转换为累加树


28.删除二叉搜索树的节点

题目链接:450. 删除二叉搜索树中的节点 - 力扣(LeetCode)

  • 如果目标节点大于当前节点值,则去右子树中删除;

  • 如果目标节点小于当前节点值,则去左子树中删除;

  • 如果目标节点就是当前节点,分为以下三种情况:

    • 其无左子:其右子顶替其位置,删除了该节点;

    • 其无右子:其左子顶替其位置,删除了该节点;

    • 其左右子都有:其左子树转移到其右子树的最左节点的左子树上,然后右子树顶替了其位置,并且删除该节点;

      左右子树都有的情况

      image-20221115090229467

代码实现

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        return dfs(root, key);
    }
    public TreeNode dfs(TreeNode root, int key){
        if(root == null){
            return null;
        }

        if(root.val > key) root.left = dfs(root.left, key);
        else if(root.val < key) root.right = dfs(root.right, key);
        else{// 当前节点是要删除的节点
            if(root.left == null) return root.right;// 情况1:左子树为空
            if(root.right == null) return root.left;// 情况2:右子树为空

            // 情况3:左右都不为空
            TreeNode node = root.right;
            while(node.left != null){// 找出右子树最左的节点
                node = node.left;
            }
            node.left = root.left;// 删除欲删除节点 拼接
            root = root.right;// 跟换删除后树的根节点
        }

        // 递归完整结束后 返回根节点
        return root;
    }
}

29.修剪二叉搜索树

题目链接:669. 修剪二叉搜索树 - 力扣(LeetCode)

思路

  • root的元素值为null,直接返回null
   if(root == null){
            return null;
        }
  • root.val < low,递归右子树,并返回右子树符合条件的头节点
 if(root.val<low){
            return dfs(root.right,low,high);
        }
  • root.val > high,递归左子树,并返回左子树符合条件的头节点
    if(root.val>high){
            return dfs(root.left,low,high);
        }
  • 接下来将下一层处理完左子树结果赋值给root->left,右子树结果赋值给root->right。最后返回root
     root.left = dfs(root.left,low,high);
        root.right = dfs(root.right,low,high);

        return root;

代码实现

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        return dfs(root,low,high);
    }
    public TreeNode dfs(TreeNode root, int low, int high){
        if(root==null){
            return null;
        }
        if(root.val<low){
            return dfs(root.right,low,high);
        }
        if(root.val>high){
            return dfs(root.left,low,high);
        }
        root.left = dfs(root.left,low,high);
        root.right = dfs(root.right,low,high);

        return root;
    }
}

30.将有序数组转换为二叉搜索树

题目链接:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)

思路

  • 确定递归终止条件
if(left>right) return null;
  • 确定单层递归逻辑
 int mid = (right + left)/2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = dfs(nums,left,mid-1);
        root.right = dfs(nums,mid+1,right);
        return root;

代码实现

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return dfs(nums,0,nums.length-1);
    }
    public TreeNode dfs(int[] nums, int left, int right){
        if(left > right){
            return null;
        }
        int mid = (right + left)/2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = dfs(nums,left,mid-1);
        root.right = dfs(nums,mid+1,right);
        return root;
    }
}

31. 把二叉搜索树转换为累加树

题目链接:538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)

思路

  • 递归函数参数以及返回值

定义一个全局变量pre,用来保存cur节点的前一个节点的数值,定义为int型就可以了

int pre = 0;
 public TreeNode convertBST(TreeNode root) {
 }
  • 确定终止条件
if(root==null) return;
  • 确定单层递归的逻辑
   //右中左
        dfs(root.right);
        root.val+=pre;
        pre = root.val;
        dfs(root.left);
        return root;

代码实现:

class Solution {
    int pre = 0; 
    public TreeNode convertBST(TreeNode root) {
        return dfs(root);
    }
    public TreeNode dfs(TreeNode root){
        if(root==null){
            return null;
        }
        //右中左
        dfs(root.right);
        root.val+=pre;
        pre = root.val;
        dfs(root.left);
        return root;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MapReduce编程模型——自定义序列化类实现多指标统计

&#x1f3e0;Hadoop序列化 &#x1f449;序列化 序列化就是把内存中的对象&#xff0c;转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据&#xff0c;转换成内存中的对象。 &#…

7天酒店亮相中国国际饭店业大会元宇宙线上展 创见酒店投资新未来

11月12日&#xff0c;由中国饭店协会主办的第一届酒旅菁英品牌嘉年华“元宇宙”线上展成功举行。7天酒店“元宇宙”展馆首度亮相&#xff0c;通过数字化交互、虚拟展厅、线上路演等&#xff0c;为行业和市场带来耳目一新的创新营销形式。 作为第七届中国国际饭店业大会的线上分…

基于微信小程序的药店管理系统设计与实现-计算机毕业设计源码+LW文档

小程序开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mav…

蓝牙HID——将android设备变成蓝牙鼠标/触控板(BluetoothHidDevice)

前言 本篇为蓝牙HID系列篇章之一&#xff0c;本篇以红米K30&#xff08;MIUI13即Android 12&#xff09;手机作为蓝牙HID设备&#xff0c;可以与电脑、手机、平板等其他蓝牙主机进行配对从而实现鼠标触控板的功能。 蓝牙HID系列篇章&#xff1a; 蓝牙HID——将android设备变成…

babel-plugin-import 实现按需引入

官方文档&#xff1a;https://github.com/umijs/babel-plugin-import#usage 为什么需要这个插件&#xff1f; 在 antd 和 element 两个组件库中&#xff0c;index.js 分别是这样的&#xff1a; // antd export { default as Button } from ./button; export { default as Tab…

智能云门禁解决方案来了

传统门禁存在的问题 01、安全性差&#xff1a;传统门禁卡易被复制和盗用无法精准识别进出人员身份造成较大安全隐患。 02、通行不便&#xff1a;要求人员近距离操作&#xff0c;当使 用者双手被占用时通行不便 门禁卡丢失或密码遗忘造成 无法开门。 03、管理困难&#xff1a…

Multilevel Cooperative Coevolution for Large Scale Optimization

0、论文背景 本文在CCEA_G的基础上&#xff0c;提出了MLCC框架。在MLCC中&#xff0c;基于不同组大小的随机分组策略构造了一组问题分解器。演化过程分为若干个循环&#xff0c;在每个周期开始时&#xff0c;MLCC使用自适应机制根据其历史性能选择分解器。由于不同的组大小捕获…

数据结构-图的存储结构

目录 图的存储结构邻接矩阵邻接表图的邻接矩阵和邻接表两种存储结构各有什么优缺点?图的存储结构 邻接矩阵 邻接矩阵的主要特点:

spring7:总结56

1.handler的形参解析&#xff08;即如何把请求参数转化为形参&#xff09; 注解参数解析原理 model and map解析原理 自定义对象处理原理 2.数据响应原理&#xff08;即如何把返回值传给前端&#xff09; 整体返回原理 详解其中的内容协商流程&#xff08;基于请求头&#x…

数据库分区的通俗解释

关于数据库分区&#xff0c;分表&#xff0c;分库&#xff0c;我通俗易懂的来举几个栗子&#xff0c;看过还不懂&#xff0c;你打我。。。 村里一家四口人(老爹叫A)有两儿子(分别是A1&#xff0c;A2)&#xff0c;长大了要自己种地了&#xff0c;就嚷嚷着要分家&#xff0c;把村…

虚拟机(Vmware)磁盘扩容(xfs格式)

先将虚拟机关机&#xff0c;按上图调整虚拟磁盘大小。 1.开启并进入虚拟机&#xff0c;打开终端&#xff0c;输入命令 df -Th 查看格式&#xff0c;图示中 /dev/mapper/centos-root 类型为xfs。 [mangolocalhost ~]$ df -Th Filesystem Type Size Used Ava…

luffy-(9)

内容概览 redis图形化客户端redis字符串操作redis hash操作redis列表操作redis管道redis其他操作django中集成rediscelery介绍 redis图形化客户端 安装图形化客户端redis-desktop-manager 新版本收费&#xff0c;可以使用老版本 QT平台&#xff1a;可以写图形化界面 python&…

腾讯云~Kafka 监控 Kafka Eagle 图形化版本

文章目录1. 安装包下载2. 开启kafka JMX3. 安装JDK&#xff0c;配置JAVA_HOME4. 上传安装包、解压5. 配置Kafka-eagle环境变量6. 配置Kafka_eagle7. 配置ke.sh8. 启动Kafka_eagle9. 防火墙10. 访问Kafka eagle1. 安装包下载 官网地址&#xff1a;EFAK 本文使用3.0.1版本 2. …

【保姆级·创建对象】如何利用resolveBeforeInstantiation()在预处理阶段返回一个Bean的实例对象

前情回顾 之前有篇文章我们有详细介绍了prepareMethodOverrides()方法并详细例举了一个lookup-method标签的例子 【保姆级】lookup-method标签实践与分析_AQin1012的博客-CSDN博客 本文我们来盘盘prepareMethodOverrides()方法后面的resolveBeaforeInstantiation()的函数&…

Android中SQLite数据库增删改查/使用ListView显示数据库内容(有完整源码)

android作业笔记 文章目录效果展示一、前言源码获取实验功能描述注意事项实现步骤二、代码展示activity_main.xml布局文件MyOpenHelper.javaMainActivity.javaList_item.xml三、&#xff08;补充&#xff09;ListView实现数据列表显示效果展示 编写SQLite数据库相关操作的代码…

【附源码】Python计算机毕业设计数据时代下的疫情管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

达梦数据库,数据库重置主键id从1开始

一、前言 今天中国国寿XX项目XC环境达梦遇到id主键自增顺序不对的问题&#xff0c;那么如何修改一个表的自增主键顺序呢&#xff1f;下边通过具体测试案例进行深入分析&#xff0c;通过delete/update/truncate/alter观察数据的变换总结出结论&#xff0c;欢迎各位喜欢达梦数据…

值得推荐的小型 C 语言开源项目:Triggerhappy

这几天在知乎上看到了一个好问题&#xff1a; 有哪些值得推荐的小型 C 语言开源项目&#xff1f; 题主很可能是想要一个这样的开源项目&#xff1a;功能小巧、代码质量高&#xff0c;可读性好&#xff0c;以便自己循序渐进地学习 C 语言。 作为一个嵌入式开发人员&#xff0…

趁年轻,大胆闯

趁年轻&#xff0c;大胆闯如果我是20岁&#xff0c;我会拿出未来的十年&#xff0c;全力已赴的赚钱&#xff0c;折腾&#xff0c;不要任何安全感。 出来创业&#xff0c;就是为100倍以上的赔率来的。

HTTPS

一、HTTPS是什么 HTTPS也是一个应用层协议&#xff0c;是在HTTP协议的基础上引入了一个加密层。 由于HTTP协议内容一般都是本文方式明文传输的&#xff0c;这就导致它在传输过程中会出现被篡改的情况。 经典案例就是万恶的“运营商劫持”&#xff01; 除了运营商可以劫持&a…