算法训练营第二十三天(二叉树完结)

news2025/2/23 4:28:54

算法训练营第二十三天(二叉树完结)

669. 修剪二叉搜索树

力扣题目链接(opens new window)

题目

给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。

在这里插入图片描述

在这里插入图片描述

解答

自己写的递归
class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
		if (root == null)
			return null;
		if (root.val == low){
			root.left = null;
			root.right = trimBST(root.right,low,high);
		}else if (root.val == high){
			root.right = null;
			root.left = trimBST(root.left,low,high);
		}else if (root.val > low && root.val < high){
			root.left = trimBST(root.left,low,high);
			root.right = trimBST(root.right,low,high);
		}else if (root.val < low)
			root = trimBST(root.right,low,high);
		else
			root = trimBST(root.left,low,high);
		return root;
    }
}
简化递归
class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
		if (root == null)
			return null;

		if (root.val < low)
			root = trimBST(root.right,low,high);//左子树和根都不要了
		else if (root.val > high)
			root = trimBST(root.left,low,high);//右子树和根都不要了
		else {
			// root在[low,high]范围内
			root.left = trimBST(root.left,low,high);
			root.right = trimBST(root.right,low,high);
		}
		return root;
    }
}
迭代(看下图就理解了)
class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
		if(root == null)
			return null;
		// 处理头结点,让root移动到[L, R] 范围内,注意是左闭右闭
		while(root != null && (root.val < low || root.val > high)){
			if(root.val < low)
				root = root.right;// 小于L往右走
			else
				root = root.left;// 大于R往左走
		}

		TreeNode curr = root;

		// 此时root已经在[L, R] 范围内,处理左孩子元素小于L的情况
		while(curr != null){
			while(curr.left != null && curr.left.val < low){
				curr.left = curr.left.right;
			}
			curr = curr.left;
		}
		//go back to root;
		curr = root;

		// 此时root已经在[L, R] 范围内,处理右孩子大于R的情况
		while(curr != null){
			while(curr.right != null && curr.right.val > high){
				curr.right = curr.right.left;
			}
			curr = curr.right;
		}
		return root;
    }
}

在这里插入图片描述

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

力扣题目链接(opens new window)

题目

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

在这里插入图片描述

解答

使用新的空间
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
		if (nums.length == 0)
			return null;
		int midIndex = nums.length / 2;
		TreeNode root = new TreeNode(nums[midIndex]);
		root.left = sortedArrayToBST(Arrays.copyOfRange(nums,0,midIndex));
		root.right = sortedArrayToBST(Arrays.copyOfRange(nums,midIndex + 1,nums.length));
		return root;
    }
}
使用索引(左闭右开)
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
		return sortedArrayToBST(nums, 0, nums.length);
    }
	//左闭右开
	public TreeNode sortedArrayToBST(int[] nums, int left, int right) {
		if (left >= right) {
			return null;
		}
		if (right - left == 1) {
			return new TreeNode(nums[left]);
		}
		int mid = left + (right - left) / 2;
		TreeNode root = new TreeNode(nums[mid]);
		root.left = sortedArrayToBST(nums, left, mid);
		root.right = sortedArrayToBST(nums, mid + 1, right);
		return root;
	}
}

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

力扣题目链接(opens new window)

题目

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

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

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

示例 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]

示例 2:

  • 输入:root = [0,null,1]
  • 输出:[1,null,1]

示例 3:

  • 输入:root = [1,0,2]
  • 输出:[3,3,2]

示例 4:

  • 输入:root = [3,2,4,1]
  • 输出:[7,9,4,10]

提示:

  • 树中的节点数介于 0 和 104 之间。
  • 每个节点的值介于 -104 和 104 之间。
  • 树中的所有值 互不相同 。
  • 给定的树为二叉搜索树

解答

  • 采取中序遍历,不过是右中左,相当于从最大到最小遍历
  • 对于每一个结点,他的值都等于他之前遍历的所有的值的和
  • 下面的sum其实也相当于双指针中的pre,初始状态pre指向空,cur指向最右侧结点
递归
class Solution {
	int sum = 0;
    public TreeNode convertBST(TreeNode root) {
		travel(root);
		return root;
    }

	private void travel(TreeNode root){
		if (root == null)
			return;
		//右中左
		travel(root.right);

		root.val += sum;
		sum = root.val;

		travel(root.left);
	}
}
//不好理解
class Solution {
    public TreeNode convertBST(TreeNode root) {
		travel(root,0);
		return root;
    }

	private int travel(TreeNode root,int sum){
		if (root == null)
			return sum;
		//右中左
		root.val += travel(root.right,sum);
		return travel(root.left,root.val);//每次执行完都是为下一轮做准备
	}
}
迭代
class Solution {
    public TreeNode convertBST(TreeNode root) {
		//右中左
		Stack<TreeNode> stack = new Stack<>();
		int sum = 0;
		TreeNode cur = root;
		//右中左
		while (!stack.isEmpty() || cur != null){
			while (cur != null){
				stack.push(cur);
				cur = cur.right;
			}
			cur = stack.pop();
			cur.val += sum;
			sum = cur.val;
			cur = cur.left;
		}
		return root;
    }
}

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

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

相关文章

2024年第十七届 认证杯 网络挑战赛 (A题)| 保暖纤维的保暖能力 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看认证杯 网络挑战赛 (A题&#xff09;&#xff01…

两数相加(leetcode)

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

基于Java的图书借阅网站, java+springboot+vue开发的图书借阅管理系统 - 毕业设计 - 课程设计

基于Java的图书借阅网站&#xff0c; javaspringbootvue开发的图书借阅管理系统 - 毕业设计 - 课程设计 文章目录 基于Java的图书借阅网站&#xff0c; javaspringbootvue开发的图书借阅管理系统 - 毕业设计 - 课程设计一、功能介绍二、代码结构三、部署运行1、后端运行步骤2、…

社会工程学——setoolkit的简单使用(克隆钓鱼网站)

Social Engineer Toolkit&#xff08;SET&#xff09;是一个开源的社会工程学攻击工具包&#xff0c;旨在模拟和执行多种社会工程学攻击&#xff0c;例如钓鱼、恶意软件传播和其他形式的社会工程学攻击。SET由David Kennedy&#xff08;也被称为"ReL1K"&#xff09;开…

ubuntu20.04下搜狗输入法的安装

1、安装 fcitx 输入法的框架 sudo apt install fcitx-bin sudo apt-get install fcitx-table 2、Ubuntu下的默认浏览器火狐搜索 搜狗输入法 搜狗输入法linux-首页 &#xff08;下载x86_64) 3、安装依赖 sudo apt install libqt5qml5 libqt5quick5 libqt5quickwidgets5 qml-modu…

取数游戏(dfs)

前言&#xff1a; 该题取自洛谷P1123&#xff0c;题主用的dfs&#xff08;深度优先搜索&#xff09; 题目描述&#xff1a; 数据范围&#xff1a; 思路&#xff1a; 思路见代码&#xff0c;注释的很清晰嗷 AC代码&#xff1a; #include <iostream> #include <alg…

【学习笔记】R语言入门与数据分析1

数据分析 数据分析的过程&#xff1a; 数据采集 数据存储 数据分析 数据挖掘 数据可视化 进行决策 数据挖掘 数据量大 复杂度高&#xff0c;容忍一定的误差限 追求相关性而非因果性 数据可视化 直观明了 R语言介绍 R是免费的&#xff08;开源软件、扩展性好&#xff09;…

PlanUML和Mermaid哪个好?

引言 在当今信息化快速发展的时代&#xff0c;数据可视化和图表工具不仅对于程序员&#xff0c;也对于非技术背景的人士至关重要。绘图工具可以帮助我们更好地理解和表达复杂的概念或数据流。PlantUML和Mermaid是两款被广泛使用的绘图语言&#xff0c;它们都能够通过简洁的文本…

4.11学习总结

一.IO流 一.java中IO的初步了解 (一).概念: Java中I/O操作主要是指使用Java进行输入&#xff0c;输出操作. Java所有的I/O机制都是基于数据流进行输入输出&#xff0c;这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据…

基于Python豆瓣电影数据可视化分析系统的设计与实现

大数据可视化项目——基于Python豆瓣电影数据可视化分析系统的设计与实现 2024年4月最新编写的新项目 项目介绍 本项目旨在通过对豆瓣电影数据进行综合分析与可视化展示&#xff0c;构建一个基于Python的大数据可视化系统。通过数据爬取收集、清洗、分析豆瓣电影数据&#xff…

【SpringBoot】SpringBoot项目快速搭建

本文将介绍Springboot项目的快速搭建 快速创建SpringBoot项目 打开IDEA在File->New->Project中新建项目 点击左侧的Spring Initializr 输入以下信息&#xff1a; Name 项目名称Group 根据公司域名来&#xff0c;或者默认com.example【倒序域名】Package Name 包名&am…

【java探索之旅】走进循环结构 深入解析while、for和do while的用法

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、循环结构1.1 while循环1.2 while代码示例1.3 break1.4 continue 二、for循环2.1 基…

蓝桥杯第十一届c++大学B组详解

目录 1.字符串排序 2.门牌制作 3.即约分数 4.蛇型填数 5.跑步锻炼 6.七段码 7.成绩统计 8.回文日期 9.字串分值和 10.平面切分 1.字符串排序 题目解析&#xff1a;这个题目真没搞懂。有会的大佬教我一下谢谢。 2.门牌制作 题目解析&#xff1a;出过超级多这类题目&am…

Java springboot+vue宠物爱心组织管理系统附赠万字文档

项目演示视频: &#xff08;有文档&#xff09;Java springboot宠物爱心组织管理系统 项目介绍: &#xff08;有文档&#xff09;Java springboot宠物爱心组织管理系统 技术&#xff1a; 基于springboot Vue 的宠物爱心组织管理系统&#xff08;宠物爱心组织管理系统&#xf…

12-pyspark的RDD算子注意事项总结

目录 相近算子异同总结相近变换算子异同foreach和foreachPartitionfold和reducecoalesce和repatition 相近动作算子异同cache和persist 算子注意事项需要注意的变换算子需要注意的动作算子 PySpark实战笔记系列第三篇 10-用PySpark建立第一个Spark RDD(PySpark实战笔记系列第…

【记录】Prompt模板|作为甲方怎么清晰专业地描述自己的需求(又名“乙方,给你的甲方扔个GPT解放自己吧”)

这篇Prompt摘抄并修改自朋友送给我的书的第49页5.2.3让ChatGPT构建提示&#xff0c;质量挺不错&#xff0c;支持一下她的博客&#xff1a;【好书推荐2】AI提示工程实战&#xff1a;从零开始利用提示工程学习应用大语言模型。 书长这样&#xff1a; 不啰嗦了&#xff0c;正文如…

代码解读:使用Stable Diffusion完成相似图像生成任务

Diffusion models代码解读&#xff1a;入门与实战 前言&#xff1a;作为内容生产重要的一部分&#xff0c;生成相似图像是一项有意义的工作&#xff0c;例如很多内容创作分享平台单纯依赖用户贡献的图片已经不够了&#xff0c;最省力的方法就是利用已有的图片生成相似的图片作为…

vscode 之 win11前端环境安装(javascrip、html、nodejs以及插件推荐)

javascript 也可以用来编写一些小工具&#xff0c;包括但不限于浏览器的插件&#xff0c;浏览器的书签以及进行一些其他操作的小工具等。 这时候就需要进行安装前端相关的测试环境 1. nodejs &#xff08;1&#xff09;确保电脑存在 nodejs 的环境 在 cmd 输入 npm -v node -…

DataEase-V1.18版本源码通过Docker镜像部署与静态资源通过阿里云OSS存储实现看这一篇就够了

修改DataEase实现静态资源阿里云OSS存储 后端源码文件读取配置类配置 1.阿里云OSS配置类 /*** ClassName AliyunConfig.java* author shuyixiao* version 1.0.0* Description 阿里云OSS配置* createTime 2024年04月03日 10:03:00*/ Data Configuration public class AliyunC…

Docker端口一直占用问题,docker重置(端口无法释放)(彻底重置docker环境)

文章目录 背景解决方法&#xff1a;彻底重置docker环境1. 停止所有Docker容器2. 删除所有容器3. 删除所有Docker镜像4. 删除所有Docker网络5. 删除所有Docker卷6. 清理Dangling资源7. 停止Docker服务8. 删除Docker数据和配置文件9. 重启Docker服务10. 验证 在这里插入图片描述验…