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

文章目录

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

题目

标题和出处

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

出处: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.hqwc.cn/news/333820.html

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

相关文章

基于Github官方教程的快速入门学习

GitHub 是一个用于版本控制和协作的代码托管平台。 它允许您和其他人随时随地协同处理项目。 创建仓库 在任何页面的右上角&#xff0c;使用 下拉菜单选择“新建存储库”。 之后会进入创建仓库的界面&#xff0c;需要我们进行如下操作&#xff1a; 写仓库的名字写对于本仓库…

Mate X5对应用进行专门适配,刷视频和文章的体验比直板机强太多

虽然说折叠机是否适合当主力机使用一直是一个有争议的问题&#xff0c;但折叠机在阅读浏览方面的体验真的是要比直板机强太多。 比如办公时&#xff0c;各种表格报单、海报PPT都是更大更清晰&#xff0c;一览无遗&#xff0c;体验过基本就回不去了。 而华为的最新折叠屏&…

文件共享不泄露:安全可靠的企业网盘推荐

在商业合作中&#xff0c;文件共享的安全性一直是人们关注的焦点。为了防止文件泄露或意外传播&#xff0c;我们需要采取措施来确保文件的安全性。Zoho WorkDrive企业网盘提供了使文件共享更安全、更可靠的解决方案。 最近&#xff0c;我们采访了两位设计师老张和小李&#xff…

C++学习笔记(二十九):c++ 创建与使用库

c自己创建库并使用库。当项目较大时&#xff0c;创建库有助于帮助代码模块化&#xff0c;同时提高代码重用。同时使用库允许程序中混合使用编程语言。首先创建一个空项目名为Game&#xff0c;接着在visiualstudio的解决方案上右击->添加->新建项目&#xff0c;添加一个空…

【漏洞复现】锐捷EG易网关login.php命令注入漏洞

Nx01 产品简介 锐捷EG易网关是一款综合网关&#xff0c;由锐捷网络完全自主研发。它集成了先进的软硬件体系架构&#xff0c;配备了DPI深入分析引擎、行为分析/管理引擎&#xff0c;可以在保证网络出口高效转发的条件下&#xff0c;提供专业的流控功能、出色的URL过滤以及本地化…

扫码能看图片吗?图片怎么弄成二维码?

在外出游玩或者参加展览时&#xff0c;经常会看到很多的物品或者展物都会有一个对应的二维码&#xff0c;通过扫码就可以查看详情&#xff0c;其中很多的内容为了美观性都会单独将内容设计成图片存入二维码中&#xff0c;那么图片制作二维码怎么制作呢&#xff1f; 想要快速的…

【leetcode 447. 回旋镖的数量】审慎思考与推倒重来

447. 回旋镖的数量 题目描述 给定平面上 **n **对 互不相同 的点 points &#xff0c;其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 &#xff0c;其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等&#xff08;需要考虑元组的顺序&#xff09;。 返回平…

list容器

list容器 文章目录 list容器一、头文件二、基本概念三、构造函数四、赋值和交换五、大小操作六、插入和删除七、存取操作八、反转和排序 一、头文件 #include <list>二、基本概念 功能: 将数据进行链式存储 链表(list) 是一种物理存储单元上非连续的存储结构,数据元素的…

万能字符单词拼写 - 华为OD统一考试

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 有一个字符串数组 words 和一个字符串 chars。假如可以用 chars 中的字母拼写出 words 中的某个"单词"(字符串),那么我们就认为你掌握了这个单词。 words 的字符仅由 a-z 英文小写宁母组成,…

RK3568上如何使用MPP进行硬解码

目录 前言正文一、FFmpeg 拉流处理二、RK3568 mpp硬解码1、简介2、普通mpp解码流程3、核心代码 END、总结的知识与问题1、一直出现jitter buffer full 这样的问题2、如何打印帧率&#xff1f;3、分析av_packet_alloc、av_init_packet、av_packet_unref、av_packet_free、av_fra…

Next City 数都上海应用创新大赛结果公布,子虔科技获奖

12月16日&#xff0c;以“应变求机 以数谋新”为主题的上海城市数字化转型体验周举办。作为上海城市数字化转型年终重磅活动&#xff0c;上海市人民政府副秘书长庄木弟&#xff0c;市经济和信息化工作党委书记程鹏&#xff0c;杨浦区委副书记、区长周海鹰&#xff0c;市经济和信…

数据结构实验2:队列的应用

目录 一、实验目的 二、实验原理 1.1 队列的基本操作 1.1.1 队列的定义 1.1.2 队列的初始化 1.1.3 入队操作 1.1.4 出队操作 1.1.5 检查队列是否为空 1.1.6 返回队列的长度 2.1队列的运用 三、实验内容 问题描述 代码 截图 分析 一、实验目的 1、理解并掌握队列…