二叉树题目:好叶子结点对的数量

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:好叶子结点对的数量

出处:1530. 好叶子结点对的数量

难度

6 级

题目描述

要求

给定二叉树的根结点 root \texttt{root} root 和整数 distance \texttt{distance} distance。如果二叉树中两个不同的结点之间的最短路径长度小于或者等于 distance \texttt{distance} distance,那它们构成一组好叶子结点对。

返回树中好叶子结点对的数量。

示例

示例 1:

示例 1

输入: root = [1,2,3,null,4], distance = 3 \texttt{root = [1,2,3,null,4], distance = 3} root = [1,2,3,null,4], distance = 3
输出: 1 \texttt{1} 1
解释:树的叶结点是 3 \texttt{3} 3 4 \texttt{4} 4,它们之间的最短路径的长度是 3 \texttt{3} 3。这是唯一的好叶子结点对。

示例 2:

示例 2

输入: root = [1,2,3,4,5,6,7], distance = 3 \texttt{root = [1,2,3,4,5,6,7], distance = 3} root = [1,2,3,4,5,6,7], distance = 3
输出: 2 \texttt{2} 2
解释:好叶子结点对为 [4,5] \texttt{[4,5]} [4,5] [6,7] \texttt{[6,7]} [6,7],最短路径长度都是 2 \texttt{2} 2。但是叶子结点对 [4,6] \texttt{[4,6]} [4,6] 不满足要求,因为它们之间的最短路径长度是 4 \texttt{4} 4

示例 3:

输入: root = [7,1,4,6,null,5,3,null,null,null,null,null,2], distance = 3 \texttt{root = [7,1,4,6,null,5,3,null,null,null,null,null,2], distance = 3} root = [7,1,4,6,null,5,3,null,null,null,null,null,2], distance = 3
输出: 1 \texttt{1} 1
解释:唯一的好叶子结点对是 [2,5] \texttt{[2,5]} [2,5]

数据范围

  • 树中结点数目在范围 [1, 2 10 ] \texttt{[1, 2}^\texttt{10}\texttt{]} [1, 210]
  • 1 ≤ Node.val ≤ 100 \texttt{1} \le \texttt{Node.val} \le \texttt{100} 1Node.val100
  • 1 ≤ distance ≤ 10 \texttt{1} \le \texttt{distance} \le \texttt{10} 1distance10

解法

思路和算法

对于二叉树中的任意两个不同的叶结点,这两个叶结点之间的最短路径是唯一的,且一定经过最近公共祖先。对于每个结点,如果其左子树和右子树都非空,则在其左子树和右子树中各选一个叶结点,这两个叶结点的最近公共祖先即为当前结点,当前结点和两个叶结点的距离之和即为两个叶结点之间的最短路径长度。

为了计算好叶结点对的数量,需要对每个结点计算以当前结点为根结点的子树中的每个叶结点和当前结点的距离,并使用列表存储这些距离。由于好叶结点对满足最短路径长度不超过 distance \textit{distance} distance,因此列表中只需要存储不超过 distance \textit{distance} distance 的距离。可以使用深度优先搜索计算子树中每个叶结点和子树根结点的距离,具体做法如下。

  • 如果当前结点为空,则不存在叶结点,返回空列表。

  • 如果当前结点的左子结点和右子结点都为空,则当前结点为叶结点,叶结点和当前结点的距离为 0 0 0,在列表中添加元素 0 0 0 之后返回列表。

  • 对于其余情况,首先对左子树和右子树分别得到距离列表,对于每个非空子树的距离列表,其中的每个距离加 1 1 1 之后的结果即为叶结点到当前结点的距离,因此将每个非空子树的距离列表中的距离加 1 1 1 之后的值添加到当前结点的距离列表,然后返回列表。

在对每个结点计算子树中每个叶结点和子树根结点的距离的同时,即可计算好叶结点对的数量。如果一个结点的左子树和右子树都不为空,则遍历左子树和右子树的距离列表,并分别计算左子树和右子树中的每对叶结点之间的最短路径长度(同一对叶结点必须分别属于左子树和右子树)。如果一对叶结点之间的最短路径长度不超过 distance \textit{distance} distance,则将好叶结点对的数量加 1 1 1

遍历结束之后,即可得到二叉树中的好叶结点对的数量。

代码

class Solution {int pairs = 0;public int countPairs(TreeNode root, int distance) {getDistances(root, distance);return pairs;}public List<Integer> getDistances(TreeNode node, int distance) {List<Integer> distances = new ArrayList<Integer>();if (node == null) {return distances;}if (node.left == null && node.right == null) {distances.add(0);return distances;}List<Integer> leftDistances = getDistances(node.left, distance);List<Integer> rightDistances = getDistances(node.right, distance);int leftSize = leftDistances.size();int rightSize = rightDistances.size();for (int i = 0; i < leftSize; i++) {int leftDistance = leftDistances.get(i) + 1;leftDistances.set(i, leftDistance);if (leftDistance <= distance) {distances.add(leftDistance);}}for (int i = 0; i < rightSize; i++) {int rightDistance = rightDistances.get(i) + 1;rightDistances.set(i, rightDistance);if (rightDistance <= distance) {distances.add(rightDistance);}}for (int leftDistance : leftDistances) {for (int rightDistance : rightDistances) {if (leftDistance + rightDistance <= distance) {pairs++;}}}return distances;}
}

复杂度分析

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2),其中 n n n 是二叉树的结点数。每个结点都被访问一次,对于每一对叶结点都需要计算最短路径长度。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是存储距离的列表和递归调用的栈空间。

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

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

相关文章

【Python学习】Python学习5-条件语句

目录 【Python学习】Python学习5-条件语句 前言if语句if语句判断条件简单的语句组参考 文章所属专区 Python学习 前言 本章节主要说明Python的条件语句&#xff0c;Python条件语句是通过一条或多条语句的执行结果&#xff08;True或者False&#xff09;来决定执行的代码块。 …

如何查看崩溃日志

目录 描述 思路 查看ipa包崩溃日志 简单查看手机崩溃信息几种方式 方式1:手机设置查看崩溃日志 方式2: Xocde工具 方式3: 第三方软件克魔助手 环境配置 实时日志 奔溃日志分析 方式四&#xff1a;控制台资源库 线上崩溃日志 线上监听crash的几种方式 方式1: 三方平…

如何启用Windows电脑的内置Administrator账户

前言 不知道从什么时候开始&#xff0c;新电脑或者新系统开机之后都会出现一个界面让你创建一个账户&#xff0c;但这个账户有可能是本地账户&#xff08;Windows10&#xff09;还有强制你登录微软账户的&#xff08;Windows11&#xff09;。 好像曾经熟悉的电脑Administrator…

Taro +vue3 中 实现 选择城市页面 主要逻辑市 选择了某个城市返回之前的页面

1.需求 当我选中了某个城市 这个页面肯定 从某个页面跳转过来的 此时我先选择了城市 再跳转回去 所以有一个问题就是如何写这个逻辑 2.实现 //当前城市页面 onMounted(() > {const instance: any Taro.getCurrentInstance();if (instance.router.params.url) {sourceUr…

Uncaught (in promise) ReferenceError: require is not defined

在 Vue3 中加载项目路径下的资源图片,起初按照之前 vue 的写法 require 但浏览器却抛出了异常 Uncaught (in promise) ReferenceError: require is not defined 因为 require 采用的 webpack 加载方式,而 vue3 中通过 vite 的方式,两者存在差异,所以才产生了刚开始的一目; vu…

C++中的虚函数

前言 本篇文章讲述C的虚函数 定义 在C语言中&#xff0c;基类将类型相关的函数和派生类不做改变直接继承的函数区分开来。对于有些函数&#xff0c;基类希望派生类各自定义适合自身的版本。那么基类就会将这些函数标记为virtual&#xff0c;这些被标记的函数就是虚函数。 下…

2024年如何使用WordPress构建克隆Udemy市场

您想创建像 Udemy 这样的学习管理 (LMS) 网站吗&#xff1f;最好的学习管理系统工具LifterLMS将帮助您制作像Udemy市场这样的 LMS 网站。 目录 Udemy市场是什么&#xff1f; 创建 Udemy 克隆所需的几项强制性技术&#xff1a; 步骤 1) 注册您的域名 步骤 2) 获取虚拟主…

springboot git配置文件自动刷新失败问题排查

http://{ip}:{port}/refresh 说明&#xff1a;springBoot版本是1.5.9&#xff0c;接口路径与2.x&#xff0c;不同 路径区别&#xff1a;/refresh VS /actuator/refresh 用postman调用refresh接口刷新git配置&#xff0c;报错如下&#xff0c;没有权限 在服务本地启动&#…

微信私密朋友圈被吐槽有BUG

日前&#xff0c;大量网友在各社交媒体上讨论微信私密朋友圈出现 Bug 的话题&#xff0c;起因是跨年期间一个网友发布了一条”私密朋友圈&#xff0c;但不一会就收到朋友发来的信息&#xff0c;”又偷偷发朋友圈了&#xff1f;“&#xff0c;估计此时网友可能已经”寒毛四起、汗…

D3篇之色卡

学习传送门&#xff1a;Sequential scales | D3 by Observable 1.scaleSequential(domain, interpolator)&#xff08;连续比例尺&#xff09; 是一种在D3.js中用于将一个范围内的连续值射到另一个范围内的连续值的方法。该比例尺通常用于将数值型数据映射到图表元素的属性上…

jenkins忘记密码后的操作

1、先停止 jenkins 服务 systemctl stop jenkins 关闭Jenkins服务 或者杀掉进程 ps -ef | grep jenkins &#xff5c;awk {print $2} | grep -v "grep" | xargs kill -9 2、找到 config.xml 文件 find /root -name config.xml3、备份config.xml文件 cp /root/.jen…

Java面试——框架篇

1、Spring框架中的单例bean是线程安全的吗&#xff1f; 所谓单例就是所有的请求都用一个对象来处理&#xff0c;而多例则指每个请求用一个新的对象来处理。 结论&#xff1a;线程不安全。 Spring框架中有一个Scope注解&#xff0c;默认的值就是singleton&#xff0c;单例的。一…

【STM32】STM32学习笔记-USART串口外设(26)

00. 目录 文章目录 00. 目录01. 串口简介02. 串口协议03. USART简介04. USART框图05. USART基本结构06. 数据帧07. 起始位侦测08. 数据采样09. 波特率发生器10. 附录 01. 串口简介 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式&#xff0c;因为它简单便…

基于FPGA的RLC测试仪

1. 系统设计 以FPGA为控制器&#xff0c;实现RLC(电阻、电容、电感)的检测&#xff0c;其测量电路如下&#xff1a;

性能优化-OpenMP基础教程(四)-Android上运行OpenMP

本文主要介绍如何在一个常规的Android手机上调试OpenMP程序&#xff0c;包括Android NDK的环境配置和使用JNI编写一个OpenMP程序运行在Android手机中。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#…

2023 年精选:每个 DevOps 团队都应该了解的 5 种微服务设计模式

微服务彻底改变了应用程序开发世界&#xff0c;将大型整体系统分解为更小、更易于管理的组件。这种架构风格的特点是独立、松散耦合的服务&#xff0c;带来了从可扩展性、模块化到更高的灵活性等众多优势。 DevOps 团队如何最好地利用这种方法来实现最高效率&#xff1f;答案在…

vue中短时间内多次点击同一个按钮会向后端发送多个请求

在vue中&#xff0c;我们可能会遇到以下问题&#xff1a; 我们有两种方法解决&#xff1a; &#xff08;1&#xff09;可以通过设置一个标志位来防止用户在短时间内多次点击同一个按钮导致向后端发送多个请求。具体实现方式如下&#xff1a; 定义一个 isFetching变量来表示当…

欧盟食品接触材料测试1935/2004/EC介绍

欧盟官方公报(OJ)发布与食品接触的塑料制品法规(EU)10/2011的修订法规(EU)2017/752。欧盟食品级塑料法规从(EU)10/2011发布以来&#xff0c;已历经7次修订&#xff0c;前5次的修订版本均是针对EU10/2011法规里的附录1授权物质清单进行修订。第6次修订法规(EU)2016/1416澄清和纠…

寻找两个相交链表的相交节点

分析&#xff1a; 如图所示&#xff0c; A 长度为mkB长度为nk张三&#xff0c;李四两人分别从A和B的起始点相同速度出发&#xff0c;无论谁到达终点时&#xff0c;都从另一条队列的起点再次出发。假定起始&#xff0c;张三沿着A走&#xff0c;李四沿着B走。当李四到达终点后&a…

thinkadmin列表多图点击放大

头像展示 原型 {field: images, title: 图片, align: center, minWidth: 200,