代码随想录第二十三天|● 669. ● 108. ● 538. ● 总结篇

news2024/11/23 8:03:15

 669. 修剪二叉搜索树 

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。

所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

示例 1:

输入:root = [1,0,2], low = 1, high = 2
输出:[1,null,2]

示例 2:

输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3
输出:[3,2,null,1]

思路

个人AC代码

递归三步曲:

        返回值为经过修剪的子树的根节点, 参数为待修剪子树的根节点

        终止条件:修剪完成即为终止

        单次递归的操作:感觉本题较之前的题目有些区别.单次递归的操作都放在了终止条件中

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        if(root == null) return root;
        //叶子节点
        if(root.left == null && root.right == null){
            //应该删除
            if(root.val < low || root.val > high){
                return null;
            }else{
                //不该删除
                return root;
            }
        }
        //非叶子 不该删除
        if(root.val >= low && root.val <= high){
            root.left = trimBST(root.left, low, high);
            root.right = trimBST(root.right, low, high);
            return root;
        }else{
            //非叶子 该删除
            //注意返回值的含义,返回当前子树修剪后的根节点
            if(root.left == null){
                root.right = trimBST(root.right, low, high);
                return root.right;
            }
            if(root.right == null){
                root.left = trimBST(root.left, low, high);
                return root.left;
            }
            //左右均不空, 左子树放在右子树最左下 或 右子树 放在左子树 最右下
            //记得首先先修剪
            root.left = trimBST(root.left, low, high);
            root.right = trimBST(root.right, low, high);
            //修剪后判断
            if(root.left != null && root.right != null) {
                TreeNode cur = root.left;
                while (cur.right != null) {
                    cur = cur.right;
                }
                cur.right = root.right;
                return root.left;
            }else if(root.left == null){
                return root.right;
            }else if(root.right == null){
                return root.left;
            }else{
                return null;
            }
        }
    }
}

看完题解后:

递归三部曲:

        返回值:经过修剪的子树的根节点, 参数为待修剪子树的根节点;

        终止条件:因为修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。

但上述代码中的修剪操作就是放在了终止条件中,根据不同的终止条件进行不同处理,这也是为什么如此繁琐.

        单次递归的操作:

        如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。

        如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。

        接下来将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。

最后返回root节点.

题解代码

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        if(root == null) return root;

        if(root.val < low){
            root.right = trimBST(root.right, low, high);
            return root.right;
        }
        if(root.val > high){
            root.left = trimBST(root.left, low, high);
            return root.left;
        }

        //root值在范围内
        root.left = trimBST(root.left, low, high);
        root.right = trimBST(root.right, low, high);
        return root;
    }
}

总结

主要的区别在于三步曲的差别. 上述思路的代码更加简练.因为它把握了二叉搜索树的性质,

        在非叶子 该删除的情况下,不需要考虑左/右子树是否为null 而应该注意到 root的值(大于high / 小于low) 对应于剩余左/右子树的节点的修剪即可. 个人代码实际是对于非搜索树适用的.

所以关键在于对二叉搜索树性质的利用.

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

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。

示例 1:

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:

输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

思路

数组构造二叉树  本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间

分割点就是数组中间位置的节点。

        那么问题来了,如果数组长度为偶数,中间节点有两个,取哪一个?

        取哪一个都可以,只不过构成了不同的平衡二叉搜索树。

代码

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

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

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

提醒一下,二叉搜索树满足下列约束条件:

  • 节点的左子树仅包含键 小于 节点键的节点。
  • 节点的右子树仅包含键 大于 节点键的节点。
  • 左右子树也必须是二叉搜索树。

注意:本题和 1038: . - 力扣(LeetCode) 相同

示例 1:

输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

思路

其实将二叉搜索树 看作一个有序数组 如 [1,2,3] 本题就很好写

结果为[6,5,3] 就是从后往前累加

        那么 对于二叉树而言

递归: 反中序遍历 因为 右 中  左

注意pre指针的使用, 记录前一个节点.

代码

class Solution {
    TreeNode pre = null;
    public TreeNode convertBST(TreeNode root) {
        add(root);
        return root;
    }
    public void add(TreeNode root){
        if(root == null) return ;
        add(root.right);
        if(pre != null){
            root.val += pre.val;
        }
        pre = root;

        add(root.left);
    }
}

总结篇 

代码随想录 (programmercarl.com)

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

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

相关文章

Trimble Business Center 2023.11crack 一机一码

1.整体解决方案套件&#xff1a;TBC 不仅仅是基线处理。它提供了一整套 GNSS 数据处理工具。无论是地形数据、卫星图像还是复杂的地理空间计算&#xff0c;TBC 都能满足。这种集成方法消除了对多个软件的需求&#xff0c;使流程更加高效。 2.以用户为中心的设计理念&#xff1a…

pytest--python的一种测试框架--pytest常用断言类型

一、pytest常用断言类型 等于: 不等于&#xff1a;&#xff01; 大于&#xff1a;> 小于&#xff1a;< 属于&#xff1a;in 不属于&#xff1a;not in 大于等于&#xff1a;> 小于等于&#xff1a;< 是&#xff1a;is 不是&#xff1a;is not def test_two():ass…

自用Proteus(8.15)仿真下载安装过程(附详细安装过程图)

文章目录 一、前言二、软件下载三、安装过程1.软件下载完成&#xff0c;进行解压缩2.右键点击Setup&#xff0c;以管理员身份运行3.点击Next&#xff0c;进行下一步4.勾选I accept...&#xff0c;点击Next5.选择使用本地安装的许可秘钥6.点击Next&#xff0c;进行下一步7.无需勾…

CSS使用clip-path实现元素动画

前言&#xff1a; 在日常开发当中&#xff0c;如果想要开发多边形&#xff0c;一般都需要多个盒子或者伪元素的帮助&#xff0c;有没有一直办法能只使用一个盒子实现呢&#xff1f; 有的&#xff1a;css裁剪 目录 前言&#xff1a; clip-path到底是什么&#xff1f; clip-pa…

读所罗门的密码笔记06_共生思想(上)

1. 共生思想 1.1. 1997年5月11日&#xff0c;IBM公司的“深蓝”计算机在与国际象棋世界冠军加里卡斯帕罗夫的第二次对弈时击败了他 1.1.1. 这台超级计算机以3.5∶2.5的战绩胜出&#xff0c;登上了世界各地的新闻头条 1.2. Alpha Zero 1.2.…

赋值语句还能当判断条件?涨芝士了!

赋值和条件看似是C语言中毫不相关的两个概念&#xff0c;虽然实际过程中我猜测不会有太多这种不太符合常理的情况出现&#xff0c;但是现在在学习的过程中&#xff0c;为了出题而出题总是会整出一些花活出来.....这很难不让人联想起高中时一些大佬为了彰显自己的数学天赋而自己…

代码学习第32天---动态规划

随想录日记part32 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.30 主要内容&#xff1a;今天开始要学习动态规划的相关知识了&#xff0c;今天的内容主要涉及两个方面&#xff1a; 不同路径 &#xff1b; 不同路径 II。 62.不同路径 63. 不同路径 II 动态…

Linux学习之软硬链接及动静态库

前言&#xff1a;在之前的文章http://t.csdnimg.cn/Lru5Thttp://t.csdnimg.cn/Lru5T 我们已经对Linux 系统里面的文件具有一定的理解了&#xff0c;现在我们将继续学习Linux里面的软硬连接和动静态库&#xff0c;这些是Linux里面的一些重要内容。 目录 一&#xff0c;文件管…

基于Givens旋转完成QR分解进而求解实矩阵的逆矩阵

基于Givens旋转完成QR分解进而求解实矩阵的逆矩阵 目录 前言 一、Givens旋转简介 二、Givens旋转解释 三、Givens旋转进行QR分解 四、Givens旋转进行QR分解数值计算例子 五、求逆矩阵 六、MATLAB仿真 七、参考资料 总结 前言 在进行QR分解时&#xff0c;HouseHolder变换…

【opencv】教程代码 —features2D(5)旋转相机的基本全景拼接

基本全景拼接 panorama_stitching_rotating_camera.cpp 将第二张图像进行透视变换后与第一张图像拼接 #include <iostream> // 包含了一些用于输入输出的函数 #include <opencv2/core.hpp> // 包含了OpenCV核心库的一些常用类和函数 #include <opencv2/imgpro…

[leetcode] 46. 全排列

文章目录 题目描述解题方法dfsjava代码复杂度分析 相似题目 题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3]…

实验三智能手机互联网程序设计(微信程序方向)实验报告

实验目的和要求 请编写下方商品列表页面&#xff0c;展示商品名称和价格&#xff1b; 二、实验步骤与结果&#xff08;给出对应的代码或运行结果截图&#xff09; Index.WXML <view class"shop" wx:for"{{10}}"> <vie…

何從Microsoft下載Windows 10 最新版本的ISO

許多新手用戶不知道如何從Microsoft下載最新版本的Windows 10 ISO(32 位或 64 位)。在本指南中,我們將向您展示如何直接從Microsoft下載最新版本的Windows 10 ISO。請注意收藏以備不時之需哦。 您可能知道,除了幾個次要更新外,微軟每年都會向 Windows 10 發布兩個主要更新…

阿里云服务器ECS u1实例ecs.u1-c1m2.large性能测评

阿里云服务器u1是通用算力型云服务器&#xff0c;CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器&#xff0c;ECS通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xf…

Yarn的安装和使用(2):使用及问题解决

Yarn是JavaScript的依赖管理工具&#xff0c;它与npm类似&#xff0c;但提供了一些额外的性能优化和一致性保证。 Yarn的使用&#xff1a; 初始化项目&#xff1a; yarn init 此命令会引导您创建一个新的package.json文件&#xff0c;用于记录项目的元信息和依赖。 添加依赖&…

如何恢复已删除的 Office 文件

丢失了重要文件并需要将其找回&#xff1f;这些提示将帮助您立即恢复 Office 文档。 没有什么比无法访问您已经处理了几个小时的文档更令人沮丧的了。无论文件是否已损坏、删除或以其他方式丢失&#xff0c;都会感觉浪费了巨大的时间和精力。 幸运的是&#xff0c;使用 Micro…

Apache Hive的基本使用语法(一)

一、数据库操作 创建数据库 create database if not exists myhive;查看数据库 use myhive; desc database myhive;创建数据库并指定hdfs存储 create database myhive2 location /myhive2;删除空数据库&#xff08;如果有表会报错&#xff09; drop database myhive;…

ubuntu之搭建samba文件服务器

1. 在服务器端安装samba程序 sudo apt-get install samba sudo apt-get install smbclient 2.配置samba服务 sudo gedit /etc/samba/smb.conf 在文件末尾追加入以下配置 [develop_share] valid users ancy path /home/ancy public yes writable y…

Python文件操作命令

文件操作 我知道你最近很累&#xff0c;是那种看不见的、身体上和精神上的疲惫感&#xff0c;但是请你一定要坚持下去。就算无人问津也好&#xff0c;技不如人也好&#xff0c;千万别让烦躁和焦虑毁了你的热情和定力。别贪心&#xff0c;我们不可能什么都有&#xff0c;也别灰心…

亚信安全荣获2023年度5G创新应用评优活动两项大奖

近日&#xff0c;“关于2023 年度5G 创新应用评优活动评选结果”正式公布&#xff0c;亚信安全凭借在5G安全领域的深厚积累和创新实践&#xff0c;成功荣获“5G技术创新的优秀代表”和“5G应用创新的杰出实践”两项大奖。 面向异构安全能力的5G安全自动化响应系统 作为5G技术创…