代码随想录算法训练营第十八天| 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

news2024/9/21 2:46:16

今日内容

  • leetcode. 669 修剪二叉搜索树
  • leetcode. 108 将有序数组转换为二叉搜索树
  • leetcode. 538 把二叉搜索树转换为累加树

Leetcode. 669 修剪二叉搜索树

文章链接:代码随想录 (programmercarl.com)

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

本题更像 450. 删除二叉搜索树中的节点 - 力扣(LeetCode)的升级版,要考虑删除节点更改树的结构,并且不只是删除某一个节点,而是若干个节点。

在 Leetcode. 450 题中,递归函数的返回值是返回给上一层节点的,本题也是。本题构建的递归函数作用是修剪搜索树,并将修剪完的搜索树根节点返回。

修剪思路:若中间节点值小于区间范围,则修剪其右子树,并返回该树;若中间节点值大于区间范围,则修剪其左子树,并返回该树;若中间节点值位于区间范围内,就正常递归下去。

根据该思路写出如下代码:

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        if (root == null){return null;} // 碰到空节点,触发停止条件
        if (root.val < low){
            TreeNode right = trimBST(root.right, low, high);
            return right;
        }
        if (root.val > high){
            TreeNode left = trimBST(root.left, low, high);
            return left;
        }
        root.left = trimBST(root.left, low, high);
        root.right = trimBST(root.right, low, high);
        return root;
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(h),h为树的深度

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

文章链接:代码随想录 (programmercarl.com)

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

本题和 654. 最大二叉树 - 力扣(LeetCode)解题思路相似。 

需要注意的是,本题虽然强调要 平衡二叉搜索树 ,但实际上并不需要什么特殊操作。我们只需要默认取数组最中间的元素做分割点就好。接下来的操作就和 Leetcode. 654 一样了。

写出如下代码:

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        TreeNode root = traversal(nums, 0, nums.length);
        return root;
    }
    public TreeNode traversal(int[] nums, int start, int end){
        if (start == end){return null;}
        int middle = (end + start) / 2; // 取中间元素
        TreeNode root = new TreeNode(nums[middle]);

        // 分割左右数组
        int lStart = start;
        int lEnd = middle;
        int rightStart = middle + 1;
        int rightEnd = end;

        root.left = traversal(nums, lStart, lEnd);
        root.right = traversal(nums, rightStart, rightEnd);
        return root;
         
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(log n)

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

文章链接:代码随想录 (programmercarl.com)

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

本题的解题关键就是如何解决 累加。 

题目要把二叉搜索树转换为累加树,它要将使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

 从图中可以看出,使用 右中左 的遍历顺序就可以完美符合题意。同时我们再引入双指针,指定一个指针指向当前节点的前一个节点,便于累加。

写出代码如下:

class Solution {
    int sum = 0;
    TreeNode pre;
    public TreeNode convertBST(TreeNode root) {
        traversal(root);
        return root;
    }

    public void traversal(TreeNode root){
        if (root == null){return;}

        traversal(root.right); // 右
        
        // 中
        if (pre != null){
            int value = root.val;
            sum = pre.val + value;
            root.val = sum;
        }
        pre = root;

        // 左
        traversal(root.left);
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(h)

二叉树总结

做了那么多二叉树题目,需要对其做一些总结。

二叉树有如下几种种类:

  • 满二叉树
  • 完全二叉树
  • 搜索树
  • 平衡树

二叉树可以用链表存储,也可以用数组进行顺序存储。不过更常见的还是用链表存储。

二叉树的遍历方式分为两种:

  • 深度优先遍历。如前/中/后序遍历,一般使用递归实现
  • 广度优先遍历。也就是层序遍历,一般使用队列实现

接着就是二叉树中的各种题目分类:

  • 求普通二叉树的属性。如是否对称、求最大/最小深度、有多少节点、是否平衡等
  • 普通二叉树的构造和修改。
  • 求二叉搜索树的属性。
  • 二叉搜索树的构造和修改。
  • 二叉树的公共祖先问题

面对上述问题,可以有如下的解题经验:

  1. 涉及到二叉树的构造时,一定是用前序遍历实现的,先构造中间节点。
  2. 求普通二叉树的属性问题,一般使用后序遍历,通过递归函数的返回值做计算。注意不是所有涉及普通二叉树的属性问题都要用后序,比如求最大深度、找所有路径时就使用了前序,要根据具体要求选择适合的遍历方式。
  3. 和二叉搜索树相关的问题,就一定要用中序遍历,利用好搜索树的特性!

二叉树总结一图以蔽之:

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

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

相关文章

mathtype批量更改公式编号的格式

这是一个笔记 在使用的时候遇到的问题,经过研究发现mathtype生成的右编号公式可以批量更新 调整前 如图,如果调整前使用的是默认的编号格式,显示为 1.5 1.5 1.5: 这里面1和5的意义为: 1:节编号5:公式编号 如下:调整后 如果需要不按章节形式来分类,则可以通过以下…

大数据中心运营管理整体规划方案(32页PPT)

随着信息技术的飞速发展&#xff0c;大数据已成为推动产业升级、促进经济社会发展的重要力量。大数据中心作为数据存储、处理与分析的核心基础设施&#xff0c;其运营管理的规范化、高效化、智能化直接关系到数据价值的有效挖掘和企业的核心竞争力。大数据中心运营管理整体规划…

免费下载Win11 24H2专业版!附详细安装教程

今日&#xff0c;系统之家小编给大家带来2024年最新的Windows11 24H2专业版系统&#xff0c;更新后系统版本号将升至26100.1591。系统基于微软官方最新Windows 11 24H2专业版进行离线制作与优化&#xff0c;确保系统安全无毒&#xff0c;兼容性强&#xff0c;可完美支持新老机型…

构建可扩展的数据平台(数据平台设计中的数据网格趋势)

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 欢迎来到雲闪世界。在本文中&#xff0c;我旨在深入研究各种类型的数据平台架构&#xff0c;更好地了解它们的演变、优势、劣势和实际应用。重点是数据网格架构、它在现代数据堆栈 (MDS) 中的作用以及当今…

Getting an error trying to import environment OpenAI Gym

题意&#xff1a;尝试导入 OpenAI Gym 环境时遇到错误 问题背景&#xff1a; I am trying to run an OpenAI Gym environment: 我正在尝试运行一个 OpenAI Gym 环境&#xff1a; env gym.make("ALE/Breakout-v5", render_mode"rgb_array")But I get th…

数据分析-MAC 编程环境安装教程

目标 在 Mac 电脑上&#xff0c;安装以下环境&#xff1a; 1. 安装 Anaconda&#xff1a;用于管理 Python 及其依赖库的分发&#xff0c;适用于数据科学和机器学习。 2. 安装 chromedriver&#xff1a;用于 Selenium 自动化测试&#xff0c;尤其是与 Google Chrome 浏览器的…

【爬虫软件】YouTube关键词搜索采集工具

我用Python开发的油管关键词搜索批量采集软件。 软件界面&#xff1a; 采集结果demo数据&#xff1a; 演示视频: https://www.bilibili.com/video/BV1uz421m7JA 完整讲解&#xff1a; https://www.bilibili.com/read/cv34407726

Redis高级-----持久化AOF、RDB原理

目前已更新系列&#xff1a; 当前&#xff1a;Redis高级-----持久化AOF、RDB原理 Redis高级---面试总结5种数据结构的底层实现 Redis高级----主从、哨兵、分片、脑裂原理-CSDN博客 Redis高级---面试总结内存过期策略及其淘汰策略 计算机网络--面试知识总结一 计算机网络-…

3.数据结构-c/c++实现栈(详解,栈容量可以动态增长)

一.栈的基本介绍 栈是一种只能够在一端进行插入和删除的顺序表。如下图 空栈&#xff1a;表示不含任何元素的栈 栈顶&#xff1a;表示允许进行插入和删除元素的一端 栈底&#xff1a;表示不允许进行插入和删除元素的一端 即栈是一种后进先出的线性表数据结构 二.栈的常见操…

尚硅谷Vue入门视频 笔记

尚硅谷视频&#xff1a;https://www.bilibili.com/video/BV1Zy4y1K7SH/?spm_id_from333.999.0.0&vd_sourcecec13bbe100bddfff8baf29d18ed8994 文章目录 模板语法data与el的2种写法MVVM模型事件事件修饰符事件的基本使用 计算属性简写形式 监视属性绑定样式条件渲染列表渲…

多线程篇(可见性 原子性 有序性(可见性))(持续更新迭代)

目录 一、volatile&#xff08;关键字&#xff09;&#xff08;并发编程之美&#xff09; 1. 前言 2. synchronized与volatile关键字对比 3. 什么时候使用volatile关键字 二、volatile&#xff08;关键字&#xff09;&#xff08;深入理解JVM第三版&#xff09; 1. 前言 …

儿童护眼灯哪个牌子好?家长必看这些眼科医生推荐的台灯

如今&#xff0c;学生们经常长时间使用平板电脑、手机和电脑等电子设备&#xff0c;这些设备的屏幕会产生频闪和蓝光辐射&#xff0c;进而影响视力健康。因此&#xff0c;护眼成为了家长们普遍关心的问题。视力疲劳和眼部疾病不仅会影响个人的生活质量&#xff0c;还可能引发长…

申请超长期IP地址SSL证书

随着互联网技术的不断发展&#xff0c;信息安全成为了企业和个人关注的核心议题之一。SSL证书不仅能够加密网站的通信数据&#xff0c;保护用户隐私&#xff0c;还能增强网站的可信度&#xff0c;提升搜索引擎排名等。通常情况下&#xff0c;SSL证书是绑定到域名上的&#xff0…

09--kubernetes持久化存储和StatefulSet控制器

前言&#xff1a;本章是k8s持久化存储的详细笔记&#xff0c;由持久化引申出来的statefulset控制器和无头svc都会在本章有详细记录。 1、K8s持久化存储PV和PVC 在前面文章已经使用卷挂载的方式将pod文件持久化保存在宿主机中&#xff0c;但实际工作中pod往往会以多副本形式存…

骨传导耳机哪个牌子最好?今天安利五款好口碑骨传导耳机!

基于对运动耳机多年的使用和深入研究&#xff0c;我想传达几个朴素却重要的观点&#xff1a;购买前请三思&#xff0c;避免盲目追求潮流。虽然网络上的热门款式引人瞩目&#xff0c;但它们的热度可能转瞬即逝&#xff1b;而高价位的知名品牌耳机&#xff0c;虽然品质有保证&…

SpringBoot整合Thymleaf实现页面静态化

1. 问题需求分析 在做乐优商城时&#xff0c;页面是通过Thymeleaf模板引擎渲染后返回到客户端。当商品详情页数据渲染时&#xff0c;在后台需要大量的数据查询&#xff0c;而后渲染得到HTML页面。在用户访问量大的情况下会对数据库造成压力&#xff0c;并且请求的响应时间过长…

开放式耳机与入耳式耳机相比,有哪些优劣势?权威推荐5个实用好用品牌

​开放式耳机其实相对于入耳式耳机来说区别还是比较大的。开放式耳机现在超火&#xff0c;它们不塞进耳朵&#xff0c;这样长时间戴着耳朵也不会难受&#xff0c;还能保护耳朵卫生&#xff0c;特别受爱运动和喜欢研究耳机的朋友们欢迎。不过市面上的开放式耳机太多了&#xff0…

glsl着色器学习(三)

前面两篇文章已经创建好了顶点着色器和片段着色器并编译成功&#xff0c;下面将创建program(程序)&#xff0c;将着色器链接起来 创建Program const prg gl.createProgram(); gl.attachShader(prg, vertexShader); gl.attachShader(prg, fragmentShader); gl.linkProgram(pr…

【无标题】docker-compose一键部署项目,haproxy容器代理多个web或java容器

# 创建脚本&#xff0c;可以在java环境中运行任何的jar包或者war包#!/bin/bash/usr/local/jdk/bin/java -jar /java/src/*.?ar 一、思路分析&#xff1a; &#xff08;1&#xff09;nginx 1、下载镜像&#xff0c;将本地的dist项目的目录挂载在容器的/usr/share/nginx/html/ …

LLM大模型教程:大模型技术名词和概念太多了,一手学习笔记

、、 构建AI化需要的知识体系 Semantic Kernel Semantic Kernel是Microsoft推出的一个开源框架&#xff0c;旨在帮助开发者构建和部署AI应用&#xff0c;特别是那些需要理解和生成自然语言的应用。它提供了一种结构化的方式来定义和管理技能&#xff08;Skills&#xff09;&…