代码随想录 day 21 二叉树

news2024/11/24 18:41:18

第六章 二叉树part08

669. 修剪二叉搜索树

这道题目比较难,比 添加增加和删除节点难的多,建议先看视频理解。
题目链接/文章讲解: https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html
视频讲解: https://www.bilibili.com/video/BV17P41177ud

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

本题就简单一些,可以尝试先自己做做。
https://programmercarl.com/0108.%E5%B0%86%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html
视频讲解:https://www.bilibili.com/video/BV1uR4y1X7qL

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

本题也不难,在 求二叉搜索树的最小绝对差 和 众数 那两道题目 都讲过了 双指针法,思路是一样的。
https://programmercarl.com/0538.%E6%8A%8A%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E8%BD%AC%E6%8D%A2%E4%B8%BA%E7%B4%AF%E5%8A%A0%E6%A0%91.html
视频讲解:https://www.bilibili.com/video/BV1d44y1f7wP

总结篇

好了,二叉树大家就这样刷完了,做一个总结吧
https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E6%80%BB%E7%BB%93%E7%AF%87.html

669. 修剪二叉搜索树

题目链接

https://leetcode.cn/problems/trim-a-binary-search-tree/description/

解题思路

不符合的区间要删除掉,但是当前节点不符合,根据二叉搜索树的特性,左是小于当前节点的值,右是大于当前节点的值的,所以子树可能符合也可能不符合这个区间,那么就要递归的去找到符合的区间的节点,二叉搜索树的特性左小右大,当前节点值大于最大值去左区间找,当前节点值小于最小值去右区间找。

递归通用的思想解题,递归函数的返回值赋值给上层的父节点,返回一颗符合区间的二叉搜索树。
不符合区间的节点删除,符合区间的节点,返回给父节点进行赋值即可,
即递归的是左返回值赋值给root.left
递归的是右返回值赋值给root.right
可以画图模拟下,符合区间的节点直接赋值给父节点是符合二叉搜索树的特性的。

code

    //1.递归参数和返回值,返回这颗树的根节点,依然用递归函数的下层值赋值给父节点,以便做删除操作
    public TreeNode trimBST(TreeNode root, int low, int high) {
        if(root==null){
            return null;
        }
        //判断当前节点是否在[low,high]区间内,如果不在,要递归直到找到在区间符合的子树
        //1.最小值大于根节点说明区间一定是在右才能找到,二叉搜索的特性,当前节点的值是大于左子树的 小于右子树
        if(low>root.val){
            TreeNode right=trimBST(root.right,low,high);
            return right;
        }
        //2.最大值小于根节点说明区间一定是在左才能找到
        if(high<root.val){
            TreeNode left=trimBST(root.left,low,high);
            return left;
        }

        //3.递归给父节点赋值
        root.left=trimBST(root.left,low,high);
        root.right=trimBST(root.right,low,high);

        return root;

    }

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

题目链接

https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/

解题思路

这题直接就写出来了,没考虑题目说的平衡二叉树,不如不说平衡,那么有序数组父节点一直指向右也是二叉搜索树,就是线性的了,如果要这么做的话,是不是本题意义就不大了。
每次找中间节点分割点就可以了,分割数组,左数组,右数组,在找中间节点
二叉搜索树单调递增就是中序遍历,每次取数组的中间节点就是中节点的值
使用前序遍历 递归给根节点赋值

code

    public TreeNode sortedArrayToBST(int[] nums) {
        if(nums==null||nums.length==0){
            return null;
        }
        return recursion(nums,0,nums.length-1);
    }

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

理解 如果数组是偶数要分割的数组长度为偶数的时候节点取哪个? [-10,-3,0,5,9]
都可以的

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

题目链接

https://leetcode.cn/problems/convert-bst-to-greater-tree/description/

解题思路

二叉搜索树中序遍历是单调递增的,题目要累加大于等于当前节点的值,
如果是数组的话就是从后向前遍历,当前值依次累加到前一个,
但这是二叉树
左中右 中序遍历,单调递增从小到大
那么右中左 反中序遍历,不就是单调递减从大到小了嘛,就可以把上一个节点的值加入到当前节点,然后就顺序累加了, 只需一个前指针记录前一个节点的值,当前节点的值加上前一个节点的值就解决了。

code

    //二叉搜索树,中序遍历是单调递增的  做到累加就是把数组的后一个节点值依次和前一个节点值相加
    //反中序遍历  右中左
    public TreeNode convertBST(TreeNode root) {
        traversal(root);
        return root;
    }
    //定义一个全局遍历记录前一个节点值,方便下一个节点值相加
    int preValue=0;
    public void traversal(TreeNode node){
        if(node==null){
            return;
        }
        traversal(node.right);
        node.val+=preValue;
        preValue=node.val;
        traversal(node.left);
    }

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

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

相关文章

行业、客户双认可!路凯智行精彩亮相新疆煤博会

7月18日&#xff0c;2024丝路矿业合作论坛、第14届中国新疆国际矿业与装备博览会、第19届中国新疆国际煤炭工业博览会在新疆国际会展中心举行&#xff0c;此次论坛和展会吸引了全国26个省区市和德国、美国、日本、挪威、芬兰、法国、巴基斯坦、俄罗斯、白俄罗斯、乌兹别克斯坦等…

企业如何应对大模型落地的四大挑战?

近年来&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术取得了突飞猛进的发展&#xff0c;其中大模型&#xff08;如GPT-3、GPT-4、BERT等&#xff09;因其强大的数据处理和分析能力&#xff0c;受到了企业的高度重视。大模型在自然语…

使用nginx实现一个端口和ip访问多个vue前端

前言&#xff1a;由于安全组要求&#xff0c;前端页面只开放一个端口&#xff0c;但是项目有多个前端&#xff0c;此前一直使用的是一个前端使用单独一个端口进行访问&#xff0c;现在需要调整。 需要实现&#xff1a;这里以80端口为例&#xff0c;两个前端分别是&#xff1a;p…

[用AI日进斗金系列]用码上飞在企微接单开发一个项目管理系统!

今天是【日进斗金】系列的第二期文章。 先给不了解这个系列的朋友们介绍一下&#xff0c;在这个系列的文章中&#xff0c;我们将会在企微的工作台的“需求发布页面”中寻找有软件开发需求的用户 并通过自研的L4级自动化智能软件开发平台「码上飞CodeFlying」让AI生成应用以解…

可以免费合并pdf的软件 合并pdf文件的软件免费 合并pdf的软件免费

在数字化办公的今天&#xff0c;pdf格式因其稳定性和跨平台兼容性被广泛使用。然而&#xff0c;当我们需要将多个 pdf 文件合并为一个时&#xff0c;却往往感到力不从心。本文将为你介绍几款强大的pdf文件合并软件&#xff0c;让你轻松管理文档。 方法一、使用pdf转换器 步骤1…

Vue3 对比 Vue2

相关信息简介2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09; 2 年多开发, 100位贡献者, 2600次提交, 600次 PR、30个RFC Vue3 支持 vue2 的大多数特性 可以更好的支持 Typescript&#xff0c;提供了完整的…

亚马逊跟卖北美选品ERP操作注意事项,商标自动查询,可...

新手在美国站选品有哪几种方式呢&#xff1f;美国商标局复查未备案准确度100%。 今天来讲下美国品牌未备案准不准确。 点开采集任务&#xff0c;站点选择美国&#xff0c;有五种采集方式&#xff1a;关键词、店铺链接、类目asin&#xff0c;选择完之后点确定。 选择asin采集…

【Docker】Docker-consul容器服务自动发现与注册

目录 一.Consul概述 1.解决了什么问题 2.什么叫微服务或者注册与发现 3.consul的模式 4.相关命令 二.consul 部署 1.consul服务器部署 2.部署docker容器 3.Nginx负载均衡器 3.1.安装启动nginx 3.2.配置nginx负载均衡 3.3.创建配置consul complate模板文件 3.4.添加…

只需三步,即可使用 Kafka 托管服务快速部署微服务架构应用

微服务架构的应用程序的特点是将其组件组织得能够独立地进行开发、测试、部署和扩展。DigitalOcean App Platform&#xff08;应用平台&#xff09;的目标是通过允许用户在同一应用上添加多个组件&#xff0c;简化这一架构模型&#xff0c;使其更加平滑和易于管理。 一个简单的…

【Zotero插件】Zotero Tag为文献设置阅读状态 win11下相关设置

【Zotero插件设置】Zotero Tag为文献设置阅读状态 win11下相关设置 1.安装Zotero Tag1.1安装1.2配置1.3 win11的相关设置1.3.1 字体安装 参考教程 2.支持排序的标注参考教程 1.安装Zotero Tag 1.1安装 Zotero Tag插件下载链接安装方法&#xff1a;Zotero–》工具–》附加组件…

day1 测试基础知识

1. 阐述软件生命周期都有哪些阶段&#xff1f;常见的软件生命周期模型有哪些&#xff1f; 2.常见测试模型有哪些&#xff1f; 参考链接&#xff1a;系统测试中的W模型---测试和开发相结合_开发和测试同时进行-CSDN博客 V模型 W模型&#xff08;测试与开发并行&#xff09; …

【ROS2】高级:安全-部署指南

目标&#xff1a;了解将安全工件部署到生产系统时的最佳实践。 教程级别&#xff1a;高级 时间&#xff1a;20 分钟 内容 背景 先决条件 一般准则构建部署场景 生成 Docker 镜像理解 compose 文件 运行示例 检查容器 背景 典型的部署场景通常涉及将容器化的应用程序或软件包发送…

高校体育场小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;状态管理&#xff0c;学生管理&#xff0c;用户管理&#xff0c;体育场管理&#xff0c;用户订单管理&#xff0c;学生订单管理&#xff0c;评价信息管理&#xff0c;交流论坛&#xff0c;系统管理 微…

4 种在 Windows 11/10/8/7 上恢复永久删除文件的可靠方法

您是否在 Windows 11/10/8/7 中从桌面永久删除了重要文件&#xff1f;当您不小心删除文件然后意识到以后需要它们时&#xff0c;这可能是一个真正的痛苦。但别担心&#xff0c;您可以使用多种方法从Windows PC恢复永久删除的文件。在这篇博文中&#xff0c;我们将为您提供 4 种…

机器学习 | 回归算法原理——最小二乘法

Hi&#xff0c;大家好&#xff0c;我是半亩花海。很早便想学习并总结一本很喜欢的机器学习图书——立石贤吾的《白话机器学习的数学》&#xff0c;可谓通俗易懂&#xff0c;清晰形象。那就在此分享并作为学习笔记来记录我的学习过程吧&#xff01;本章的回归算法原理基于《基于…

Flutter Hive NoSql 数据库使用指南

Flutter Hive NoSql 数据库使用指南 视频 https://www.bilibili.com/video/BV1yJ4m1u7P2/ https://youtu.be/UJobRKdp68k 前言 原文 https://ducafecat.com/blog/flutter-hive-nosql-guide 本文将会写一个 Hive CURD 的例子&#xff0c;详细介绍 Hive 这个轻量级的 Flutter …

解决element-plus的Date Picker日期选择器组件禁用时间的坑

目前需求是有一个表单&#xff0c;其中有多个日期组件需要选择时间范围&#xff0c;并且选择的范围不可以有交集重复&#xff0c;所以这里需要用到Date Picker中的disabled-date属性&#xff0c;来判断该日期是否被禁用。 直接上代码&#xff0c;这个是我写的demo代码&#xf…

基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF.仿真输出误差收敛曲线和误差协方差收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022…

社交圈子聊天交友系统搭建社交app开发:陌生交友发布动态圈子单聊打招呼群聊app介绍

系统概述 社交圈子部天交友系统是一个集成即时通讯、社区互动、用户管理等功能的在线社交平台。它支持用户创建个人资料&#xff0c;加入兴趣围子&#xff0c;通过文字、图片、语音、视频等多种方式进行交流&#xff0c;满足用户在不同场景下的社交需求 核心功能 -&#xff0c;…

leetcode日记(46)最后一个单词的长度

很简单&#xff0c;从后往前遍历即可 class Solution { public:int lengthOfLastWord(string s) {int len0;for(int is.size()-1;i>0;i--){if(s[i]! ) len;else if(len!0) break;}return len;} };