代码随想录算法训练营 DAY 23 | 450.删除二叉搜索树中的节点 669.修剪二叉搜索树 538.把二叉搜索树转换为累加树

669.修剪二叉搜索树

  • 误区:节点不在范围内不能直接return null,因为它的右子树是可能符合边界的。虽然要删除这个节点,但还要先继续遍历右子树。

递归套递归,删除修剪的同时去递归修剪左/右子树,然后在下面递归左右子树的时候用root.left right接住

  1. 确定递归函数 传入新的左右边界,返回新的根节点
TreeNode trimBST(TreeNode root, int low, int high)
  1. 终止条件
if(root == null) return null;
  1. 单层递归逻辑

如果一个节点在边界左侧,还要往右遍历。它的返回值是这棵右子树修剪完后的根节点。

不能直接return right!因为右子树不一定完全符合边界,要递归处理。

if(root.val < low) {right = traversal(root.right,low,high); //返回值要在上一层接住return right;  //一会在上一层的左子树接住
}
if(root.val > high) {  //在边界右侧的情况同理left = traversal(root.left,low,high);return left;   //一会在上一层的右子树接住
}
root.left = traversal(root.left,low,high);
root.right = traversal(root.right,low,high);
return root;
  • 完整代码
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;}
}

这一题和上一题都是在递归的推出条件上做的文章, 遍历顺序倒无所谓

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

  • 注意 要构造一棵平衡二叉搜索树

大致思路:每一次都选择中间的节点,将这个数组分为左区间和右区间,递归遍历左区间构造左子树,遍历右区间构造右子树。

长度为偶数怎么办呢?—取左侧或者右侧的都可以

每次进入递归的时候new出来节点赋值,把它return回去 递归的时候用root.left/right接住它

注意区间的定义:保持左闭右闭

  1. 确定递归函数
TreeNode traversal(int[] nums, left, right)
  1. 确定终止条件(什么时候是非法的区间?停止构造)

    当left = right的时候,区间是合法的。

if(left > right) return null;  //此时才是非法区间
  1. 单层递归逻辑
int mid = (left + right)/2;
TreeNode root = new TreeNode(nums[mid]); //构造根节点
//接下来递归构造左右子树
root.left = traversal(nums,left,mid-1);
root.right = traversal(nums,mid+1,right);
return root;
  • 调用递归函数
return traversal(nums,0,nums.length-1);
class Solution {public TreeNode traversal(int[] nums, int left, int right) {if(left > right) return null;int mid = (left + right) / 2;TreeNode root = new TreeNode(nums[mid]);root.left = traversal(nums, left, mid-1); //更新右边界root.right = traversal(nums, mid+1, right);return root;}public TreeNode sortedArrayToBST(int[] nums) {return traversal(nums,0,nums.length-1);}
}

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

  • 思路:如果给一个有序数组,变成累加数组!就是从后往前遍历,逐个累加前面节点的数值。

二叉搜索树的中序遍历(左中右)就是一个有序(升序)数组!

如何倒序遍历呢?右中左!数组的话用双指针实现,二叉树这里也可以用双指针!pre初始化为0

class Solution {TreeNode pre = null;//右中左 遍历public void traversal(TreeNode cur) {if(cur == null) return;traversal(cur.right);if(pre != null) {  //pre不为null才相加cur.val = pre.val + cur.val;}pre = cur;traversal(cur.left);}public TreeNode convertBST(TreeNode root) {traversal(root);return root;}
}

二叉树总结篇

遍历方式

  • 深度优先

    • [二叉树:前中后序递归法:递归三部曲初次亮相
    • [二叉树:前中后序迭代法(一) :通过栈模拟递归
    • [二叉树:前中后序迭代法(二)统一风格]
  • 广度优先

    • [二叉树的层序遍历]:通过队列模拟

求二叉树的属性

  • 二叉树:是否对称
    • 递归:后序,比较的是根节点的左子树与右子树是不是相互翻转
    • 迭代:使用队列/栈将两个节点顺序放入容器中进行比较
  • 二叉树:求最大深度
    • 递归:后序,求根节点最大高度就是最大深度,通过递归函数的返回值做计算树的高度
    • 迭代:层序遍历
  • 二叉树:求最小深度
    • 递归:后序,求根节点最小高度就是最小深度,注意最小深度的定义
    • 迭代:层序遍历
  • 二叉树:求有多少个节点
    • 递归:后序,通过递归函数的返回值计算节点数量
    • 迭代:层序遍历
  • 二叉树:是否平衡
    • 递归:后序,注意后序求高度和前序求深度,递归过程判断高度差
    • 迭代:效率很低,不推荐
  • 二叉树:找所有路径
    • 递归:前序,方便让父节点指向子节点,涉及回溯处理根节点到叶子的所有路径
    • 迭代:一个栈模拟递归,一个栈来存放对应的遍历路径
  • 二叉树:递归中如何隐藏着回溯
    • 详解[二叉树:找所有路径 中递归如何隐藏着回溯
  • 二叉树:求左叶子之和
    • 递归:后序,必须三层约束条件,才能判断是否是左叶子。
    • 迭代:直接模拟后序遍历
  • 二叉树:求左下角的值
    • 递归:顺序无所谓,优先左孩子搜索,同时找深度最大的叶子节点。
    • 迭代:层序遍历找最后一行最左边
  • 二叉树:求路径总和
    • 递归:顺序无所谓,递归函数返回值为bool类型是为了搜索一条边,没有返回值是搜索整棵树。
    • 迭代:栈里元素不仅要记录节点指针,还要记录从头结点到该节点的路径数值总和

二叉树的修改与构造

  • 翻转二叉树
    • 递归:前序,交换左右孩子
    • 迭代:直接模拟前序遍历
  • 构造二叉树
    • 递归:前序,重点在于找分割点,分左右区间构造
    • 迭代:比较复杂,意义不大
  • 构造最大的二叉树
    • 递归:前序,分割点为数组最大值,分左右区间构造
    • 迭代:比较复杂,意义不大
  • 合并两个二叉树
    • 递归:前序,同时操作两个树的节点,注意合并的规则
    • 迭代:使用队列,类似层序遍历

求二叉搜索树的属性

  • 二叉搜索树中的搜索
    • 递归:二叉搜索树的递归是有方向的
    • 迭代:因为有方向,所以迭代法很简单
  • 是不是二叉搜索树
    • 递归:中序,相当于变成了判断一个序列是不是递增的
    • 迭代:模拟中序,逻辑相同
  • 求二叉搜索树的最小绝对差
    • 递归:中序,双指针操作
    • 迭代:模拟中序,逻辑相同
  • 求二叉搜索树的众数
    • 递归:中序,清空结果集的技巧,遍历一遍便可求众数集合
    • [二叉搜索树转成累加树]
    • 递归:中序,双指针操作累加
    • 迭代:模拟中序,逻辑相同

二叉树公共祖先问题

  • 二叉树的公共祖先问题
    • 递归:后序,回溯,找到左子树出现目标值,右子树节点目标值的节点。
    • 迭代:不适合模拟回溯
  • 二叉搜索树的公共祖先问题
    • 递归:顺序无所谓,如果节点的数值在目标区间就是最近公共祖先
    • 迭代:按序遍历

二叉搜索树的修改与构造

  • 二叉搜索树中的插入操作
    • 递归:顺序无所谓,通过递归函数返回值添加节点
    • 迭代:按序遍历,需要记录插入父节点,这样才能做插入操作
  • 二叉搜索树中的删除操作
    • 递归:前序,想清楚删除非叶子节点的情况
    • 迭代:有序遍历,较复杂
  • 修剪二叉搜索树
    • 递归:前序,通过递归函数返回值删除节点
    • 迭代:有序遍历,较复杂
  • 构造二叉搜索树
    • 递归:前序,数组中间节点分割
    • 迭代:较复杂,通过三个队列来模拟

总结

  • 涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。
  • 求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。
  • 求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了

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

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

相关文章

DBRX: A New State-of-the-Art Open LLM——基于专家LLM

刷知乎的时候&#xff0c;发现最近开源了一个新的大模型DBRX&#xff0c;同样是基于专家的大模型。之前找MOE的源码没找到&#xff0c;仅仅找到了一些博主写的博客内容&#xff0c;简单了解了一下内容。之前写的模型&#xff1a;Mixtral MOE代码理解添加链接描述。简单看了一下…

Kubernetes 知识体系 系列一

多年前&#xff0c;大多数软件应用程序都是大型的单体&#xff0c;要么作为单个进程运行&#xff0c;要么作为少数服务器上的少量进程运行。这种过时的系统一直延续很久。 它们的发布周期较慢&#xff0c;更新相对较少。 在每个发布周期结束时&#xff0c;开发人员将整个系统…

揭秘大型语言模型的动力之源:为何GPU不可或缺?

引言 大型语言模型&#xff08;Large Language Models, LLMs&#xff09;是当今人工智能领域最令人瞩目的技术之一&#xff0c;其在自然语言处理&#xff08;NLP&#xff09;、文本生成、对话系统等方面展现出了惊人的潜力。其中&#xff0c;像GPT-3和BERT等代表了这一领域的顶…

第三十二天-PythonWeb主流框架-Django框架

目录 1.介绍 发展历史 介绍 2.使用 1.安装 2.创建项目 3.项目结构 4.启动 3.开发流程 1.设置ip可访问 2.创建模块 3.第一个页面 4.视图 5.include()参数 6.url与视图的关系 7.响应内容 4.视图处理业务逻辑 1.响应html 2.获取url参数 3.从文件响应html内容 …

蓝桥杯真题Day40 倒计时19天 纯练题!

蓝桥杯第十三届省赛真题-统计子矩阵 题目描述 给定一个 N M 的矩阵 A&#xff0c;请你统计有多少个子矩阵 (最小 1 1&#xff0c;最大 N M) 满足子矩阵中所有数的和不超过给定的整数 K? 输入格式 第一行包含三个整数 N, M 和 K. 之后 N 行每行包含 M 个整数&#xf…

企业产品网络安全建设日志0328

文章目录 Actuator再次暴露域名上线基线检查初见效果WAF更新遇波折301跳转推进中 Actuator再次暴露 为了验证挖f的拦截效果&#xff0c;自己随手拼了个Actuator&#xff0c;结果可以访问到公司的actuator。。 据称是某网关更换新组件后未做防御&#xff0c;已要求全部做防御&a…

Portainer的替代Dockge?又一个Docker Compose管理器?

Dockge&#xff1a;让Docker Compose管理触手可及&#xff0c;一图胜千言&#xff0c;轻松构建与管控您的容器服务栈&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 Docker&#xff0c;这一开放源代码的创新平台&#xff0c;旨在实现应用程序部署、扩展与运维的自动化…

分享两种电流检测电路设计方案

大家好我是砖一。 在研发设计电路项目时&#xff0c;依据需要实现的功能指标&#xff0c;进行详细的电路方案开发与验证&#xff1b;面对项目的功能电路研发&#xff0c;工程师一般采用的做法是化整为零&#xff0c;化繁为简&#xff0c;也就是将项目的需要实现的整体功能逐一…

幻兽帕鲁Palworld游戏服务器多少钱?价格表来了,建议收藏

2024年全网最全的幻兽帕鲁服务器租用价格表&#xff0c;阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月&#xff0c;阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全&#xff1a; 阿里云幻…

2024年03月CCF-GESP编程能力等级认证C++编程三级真题解析

本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第1题 整数-5的16位补码表示是( )。 A. 1005 B. 1006 C. FFFA D. FFFB 答案:D 第2题 如果16位短整数 -2 的二进制是"FFFE&qu…

Thingworx高可用集群部署(九)-Tomcat集群部署

主机&#xff1a;10.10.10.62、10.10.10.63、10.10.10.64、10.10.10.65 用户&#xff1a;root 创建目录 mkdir -p /data/tomcat9.0 解压安装包 cd /data/soft/pkgs tar -xf apache-tomcat-9.0.48.tar.gz 移动到指定目录 mv apache-tomcat-9.0.48 /data/tomcat9.0/9.0.48…

如何把PNG图片转换成CAD图纸DWG格式

环境&#xff1a; CAD2021 PNG图片 问题描述&#xff1a; 如何把PNG图片转换成CAD图纸DWG格式 解决方案&#xff1a; 将PNG图像转换为CAD文件&#xff08;如DXF或DWG格式&#xff09;是设计和工程领域中常见的需求之一。幸运的是&#xff0c;有几种工具和软件可以帮助完成…

【考研数学】跟张宇,一看就会,一做就废,换老师有用吗?

宇哥的1000题其实很多同学在刷的时候都会觉得有点吃力&#xff0c;特别是基础不是很牢固一类的 我的感觉是如果基础很差的按照宇哥的做法可能会没有什么思路&#xff0c;基础题可能有的都分析不出来 张宇的30讲还是不太适合零基础的考研党去听...因为宇哥整体节奏较快&#x…

阿里云CentOS7安装ZooKeeper单机模式

前提条件 阿里云CentOS7安装好jdk&#xff0c;可参 hadoop安装 的jdk安装部分 下载 [hadoopnode1 ~]$ cd softinstall [hadoopnode1 softinstall]$ wget https://archive.apache.org/dist/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz 解压 [hadoopnode1 …

全网最全的幻兽帕鲁服务器价格表查询系统,一键报价

2024年全网最全的幻兽帕鲁服务器租用价格表&#xff0c;阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月&#xff0c;阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全&#xff1a; 阿里云幻…

智驾芯片“独角兽”地平线流血冲刺上市,三年累计亏损47亿元

3月26日&#xff0c;Horizon Robotics&#xff08;下称“地平线”&#xff09;向港交所递交招股书&#xff0c;高盛、摩根士丹利、中信建投国际为其联席保荐人。 据介绍&#xff0c;成立于2015年的地平线是一家人工智能计算平台公司&#xff0c;专注于为智能汽车提供高级辅助驾…

前端请求传参格式

一、格式类型 form-data application/x-www-form-urlencoded application/json text/xml 一、form-data multipart/form-data&#xff1a; 窗体数据被编码为一条消息&#xff0c;页上的每个控件对应消息中的一个部分&#xff0c;这个一般文件上传时用。 当method为post时候&a…

算法---动态规划练习-8(打家劫舍2)

打家劫舍2 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 首先&#xff0c;给定一个非负整数数组 nums&#xff0c;其中 nums[i] 表示第 i 家的财物价值。 定义两个辅助数组 f 和 g&#xff0c;长度都为 n&#xff08;n 是…

【FedCoin: A Peer-to-Peer Payment System for Federated Learning】

在这篇论文中&#xff0c;我们提出了FedCoin&#xff0c;一个基于区块链的点对点支付系统&#xff0c;专为联邦学习设计&#xff0c;以实现基于Shapley值的实际利润分配。在FedCoin系统中&#xff0c;区块链共识实体负责计算SV&#xff0c;并且新的区块是基于“Shapley证明”&a…

自定义类型:【结构体】

我们知道C语言中有许多的类型&#xff0c;比如char&#xff0c;short&#xff0c;int等等类型。像是这些C语言本身就支持的类型叫做内置类型&#xff0c;但是有一些复杂对象&#xff0c;只有这些类型是完全不够的。比如人&#xff0c;或者一本书。那么我们就可以自己定义一些类…