算法训练营第二十一天(二叉树part7)

news2024/11/27 7:42:17

算法训练营第二十一天(二叉树part7)

530.二叉搜索树的最小绝对差

力扣题目链接(opens new window)

题目

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

示例:

在这里插入图片描述

提示:树中至少有 2 个节点。

解答

方法一

利用搜索树的特性,使用中序放入数组中,数组一定是递增序列,最小的一定是相邻的两个的差值

//递归法
class Solution {
    public int getMinimumDifference(TreeNode root) {
		List<Integer> results = new ArrayList<>();//递增序列
		travel(root,results);
		int min = Integer.MAX_VALUE;
		for (int i = 0; i < results.size() - 1; i++) {
			min = Math.min(min,Math.abs(results.get(i) - results.get(i + 1)));
		}
		return min;
    }
	private void travel(TreeNode cur,List<Integer> results){
		if (cur == null)
			return;
		travel(cur.left,results);

		results.add(cur.val);

		travel(cur.right,results);
	}
}

//迭代法
class Solution {

    public int getMinimumDifference(TreeNode root) {
		List<Integer> results = new ArrayList<>();//递增序列
		Stack<TreeNode> stack = new Stack<>();
		while (root != null || !stack.isEmpty()){
			while (root != null){
				stack.push(root);
				root = root.left;
			}
			//此时栈顶是最左侧的子树的根节点,每一次循环如果没有右子树就会进行一次回溯
			TreeNode cur = stack.pop();
			results.add(cur.val);

			root = cur.right;
		}

		int min = Integer.MAX_VALUE;
		for (int i = 0; i < results.size() - 1; i++) {
			min = Math.min(min,Math.abs(results.get(i) - results.get(i + 1)));
		}
		return min;
    }
}
方法二:双指针(推荐)
class Solution {
	int result = Integer.MAX_VALUE;
	TreeNode pre;
    public int getMinimumDifference(TreeNode root) {
		travel(root);
		return result;
    }
	private void travel(TreeNode cur){
		if (cur == null)
			return;

		travel(cur.left);

		if (pre != null)
			result = Math.min(result,Math.abs(cur.val - pre.val));
		pre = cur;

		travel(cur.right);
	}
}

在这里插入图片描述

  1. travel(cur.left);在最后一次跳出循环时,此时cur指向最左侧的1,而pre指向null
  2. 接下来进行,pre指向这一轮的cur,即1
  3. 然后travel(cur.right);,同样为空
  4. cur=1这一轮结束,然后进行回溯,此时这一轮的cur指向4,因为跳出了上一层递归,而pre指向上一轮的cur即1

501.二叉搜索树中的众数

力扣题目链接(opens new window)

题目

给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。

假定 BST 有如下定义:

  • 结点左子树中所含结点的值小于等于当前结点的值
  • 结点右子树中所含结点的值大于等于当前结点的值
  • 左子树和右子树都是二叉搜索树

例如:

给定 BST [1,null,2,2],

在这里插入图片描述

返回[2].

提示:如果众数超过1个,不需考虑输出顺序

进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

解答

常规做法(没使用搜索树的特性,不推荐)
class Solution {
    public int[] findMode(TreeNode root) {
		Map<Integer,Integer> map = new HashMap<>();
		travel(root,map);
		List<Map.Entry<Integer, Integer>> sortedEntries = new ArrayList<>(map.entrySet());
		sortedEntries.sort((entry1, entry2) -> entry2.getValue().compareTo(entry1.getValue()));//降序
		List<Integer> result = new ArrayList<>();
		int count = sortedEntries.get(0).getValue();
		for (Map.Entry<Integer, Integer> sortedEntry : sortedEntries) {
			if (sortedEntry.getValue() == count)
				result.add(sortedEntry.getKey());
			else
				break;
		}

		// 转换为 Integer[]
		Integer[] arr = result.toArray(new Integer[0]);
		// 再转换为 int[]
		int[] intArr = Arrays.stream(arr).mapToInt(Integer::intValue).toArray();
		return intArr;
    }

	private void travel(TreeNode root,Map<Integer,Integer> map){
		if (root == null)
			return;
		travel(root.left,map);
		map.put(root.val,map.getOrDefault(root.val,0) + 1);
		travel(root.right,map);
	}
}
使用搜索树特性(双指针)

不使用额外空间,还是使用递归,但是由于是搜索树,所以如果使用中序只要是相同的数一定会相邻,那么如果达到最大的count就放入,如果比最大的count还大,就清空列表,重新放入

必须是双指针,不然一个指向左子树,另一个找不到根

class Solution {
	ArrayList<Integer> results;
	int maxCount;
	int count;
	TreeNode pre;
    public int[] findMode(TreeNode root) {
		results = new ArrayList<>();
		maxCount = 0;
		count = 0;
		pre = null;
		travel(root);
		int[] result = new int[results.size()];
		for (int i = 0; i < results.size(); i++) {
			result[i] = results.get(i);
		}
		return result;
    }

	private void travel(TreeNode cur){
		if (cur == null)
			return;

		travel(cur.left);

		if (pre != null && pre.val == cur.val)
			count++;
		else
			count = 1;
		pre = cur;

		if (count == maxCount)
			results.add(cur.val);
		if (count > maxCount){
			results.clear();
			maxCount = count;
			results.add(pre.val);
		}

		travel(cur.right);
	}
}

236.二叉树的最近公共祖先

力扣题目链接(opens new window)

题目

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

在这里插入图片描述

示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。

示例 2: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉树中。

解答

后序

情况1:p与q分别在左右子树

在这里插入图片描述

情况2:一个在左右子树,一个在根

		if (root == p || root == q)
			return root;//满足第二种情况
//该代码解决了情况二

在这里插入图片描述

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        return travel(root, p, q);
    }

	private TreeNode travel(TreeNode root, TreeNode p, TreeNode q){
		if (root == null)
			return null;
		if (root == p || root == q)
			return root;//满足第二种情况

		TreeNode left = travel(root.left,p,q);
		TreeNode right = travel(root.right,p,q);

		if (left != null && right != null)
			return root;
		else if (left == null && right != null)
			return right;
		else if (left != null && right == null)
			return left;
		else //left == null && right == null
			return null;
	}
}

eNode right = travel(root.right,p,q);

	if (left != null && right != null)
		return root;
	else if (left == null && right != null)
		return right;
	else if (left != null && right == null)
		return left;
	else //left == null && right == null
		return null;
}

}


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

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

相关文章

9.枚举类与注解

文章目录 1. 枚举类1.1 自定义枚举类1.2 enum关键字定义枚举类1.3 Enum类主要方法 2. 注解2.1 注解作用2.1.1 生成文档相关注解2.1.2 JDK内置基本注解-在编译时进行格式检查2.1.3 跟踪代码依赖性&#xff0c;实现替代配置文件功能 2.2 自定义Annotation2.3 JDK中的元注解2.3.1 …

Python零基础从小白打怪升级中~~~~~~~流程控制语句

第三节&#xff1a;Python的流程控制语法 一、Python条件语句的语法 if 条件1:条件1成立执⾏的代码一条件1成⽴执⾏的代码二...... elif 条件2&#xff1a;条件2成立执⾏的代码三条件2成立执⾏的代码四...... ...... else:以上条件都不成⽴&#xff0c;执行的代码五以上条件都…

海外盲盒系统开发,盲盒出口成为企业新机遇

随着盲盒的兴起&#xff0c;国内消费市场形成了万物皆可盲盒的态势。并且&#xff0c;盲盒自带社交属性&#xff0c;也成为了年轻人的社交神器。 除了在国内&#xff0c;盲盒在海外也掀起了一股热潮&#xff0c;呈现出了爆发式增长形势&#xff0c;国内热门盲盒企业也出口到了…

Redis的三种部署方案

文章目录 单机模式主从复制哨兵模式分片集群 在Redis中提供的集群方案总共有三种&#xff1a;单机模式&#xff0c;主从复制集群、哨兵模式&#xff0c;Redis分片集群 单机模式 Redis 只运行在一台服务器上&#xff0c;并且所有的数据都存储在这一台服务器的内存中。 主从复制…

小程序商城免费搭建之java商城 电子商务Spring Cloud+Spring Boot+二次开发+mybatis+MQ+VR全景

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

黄金白银价格上涨是投资机会吗?

黄金和白银&#xff0c;作为历史悠久的贵重金属&#xff0c;一直以来都被投资者视为避险资产。近年来&#xff0c;随着全球经济环境的变动&#xff0c;我们观察到黄金与白银的价格不断攀升&#xff0c;这是否预示着投资机会的到来&#xff1f;今天&#xff0c;就让我们来深度探…

【保姆级讲解SQL Server的详细使用教程】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

ATG-2021B功率信号源可以应用在哪些方面

功率信号源是一种能够产生一定功率的信号源&#xff0c;广泛应用于各个领域。下面将介绍功率信号源在电子、通信、工业和科研等方面的应用。 在电子行业中&#xff0c;功率信号源是一种重要的测试工具。它可以产生各种波形的信号&#xff0c;如正弦波、方波、脉冲波等&#xff…

vue中实现表格的局部刷新

背景&#xff1a; 列表中展示所有审核任务信息&#xff0c;包括审核状态、审核进度等&#xff0c;原来的实现是【查询】按钮绑定了一个定时器&#xff0c;定时查询整个列表&#xff0c;但是需要用户手动开启 领导觉得这种方式用户体验不好&#xff0c;希望能够实现【审核进度…

Golang | Leetcode Golang题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; func threeSumClosest(nums []int, target int) int {sort.Ints(nums)var (n len(nums)best math.MaxInt32)// 根据差值的绝对值来更新答案update : func(cur int) {if abs(cur - target) < abs(best - target) {best cur}}// 枚举 a…

人工智能支持节能的七种方式

2024年2月&#xff0c;OpenAI公布了名为“Sora”的人工智能模型。从去年的chatgpt到今天Sora发布&#xff0c;OpenAI的每⼀次重要的动作和发布&#xff0c;都伴随着⼀场场精妙绝伦精巧的事件营销&#xff0c;它的设置议题的能⼒&#xff0c;节奏控制&#xff0c;公众引导堪称创…

P1731 [NOI1999] 生日蛋糕——典型的回溯和剪枝题目,值得一看

今天尝试了一下md的编辑器&#xff0c;不知道有没有什么改变 [NOI1999] 生日蛋糕 题目背景 数据加强版 link 题目描述 7 月 17 日是 Mr.W 的生日&#xff0c;ACM-THU 为此要制作一个体积为 N π N\pi Nπ 的 M M M 层生日蛋糕&#xff0c;每层都是一个圆柱体。 设从下往…

node后端上传文件到本地指定文件夹

实现 第一步&#xff0c;引入依赖 const fs require(fs) const multer require(multer) 第二步&#xff0c;先设置一个上传守卫&#xff0c;用于初步拦截异常请求 /*** 上传守卫* param req* param res* param next*/ function uploadFile (req, res, next) {// dest 值…

GD32F470_(4线制)火光/火焰传感器模块火源探测 红外接收传感器 智能车配件

2.16 火焰传感器 红外火焰传感器可以用来探测火源或其它一些波长在700纳米~1000纳米范围内的热源&#xff0c;在机器人比赛中&#xff0c;远红外火焰探头起到非常重要的作用&#xff0c;它可以用作机器人的眼睛来寻找火源或足球。利用它可以制作灭火机器人等。 红外火焰传感器…

10-热点文章-定时计算

xxl-Job分布式任务调度 1 今日内容 1.1 需求分析 目前实现的思路&#xff1a;从数据库直接按照发布时间倒序查询 问题1&#xff1a; 如何访问量较大&#xff0c;直接查询数据库&#xff0c;压力较大 问题2&#xff1a; 新发布的文章会展示在前面&#xff0c;并不是热点文章 …

R语言数据操纵:常用函数

目录 处理循环的函数 lapply函数 apply函数 mapply函数 tapply函数 split函数 排序的函数 sort函数与order函数 总结数据信息的函数 head函数与tail函数 summary函数 str函数 table函数 any函数 all函数 xtab函数 object.size函数 这篇文章主要介绍R语言中处理…

全网最全的APP测试面试题(含文档)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、基础篇 1、请介绍一下&#xff0c;APP测试流程&#xff1f…

Windows的“上帝模式”

Windows操作系统,以其强大的功能和广泛的兼容性深受全球用户喜爱。然而,随着系统功能的日益丰富,许多深度设置和管理选项可能隐藏在层层菜单之下,不易被普通用户迅速找到。为了简化这一过程,微软在Windows Vista之后的版本中引入了一项鲜为人知但极为实用的功能——“上帝…

鸿蒙千帆起~ 是转?还是留?

近期鸿蒙系统相关行业热度一度高涨&#xff0c;像今天2024年1月18日 鸿蒙OS Next开发者预览版正式发布引起了不少业内人士关注&#xff0c;再度冲上了热榜。余承东老余之前就说过2024年是鸿蒙关键的一年&#xff0c;从这句话就可以看出后一定有大的动作。 就像去年有业内人士网…

【Android】App通信基础架构相关类源码解析

应用通信基础架构相关类源码解析 这里主要对Android App开发时&#xff0c;常用到的一些通信基础类进行一下源码的简单分析&#xff0c;包括&#xff1a; Handler&#xff1a;处理器&#xff0c;与某个Looper&#xff08;一个线程对应一个Looper&#xff09;进行关联。用于接…