当前位置: 首页 > news >正文

网站开发的热门博客/友情链接检索数据分析

网站开发的热门博客,友情链接检索数据分析,wordpress读取相册,wordpress小工具文件夹1. 问题描述: 给你二叉树的根节点 root 和一个整数 distance 。 如果二叉树中两个叶节点之间的最短路径长度小于或者等于 distance ,那它们就可以构成一组好叶子节点对 。 返回树中好叶子节点对的数量 。 示例 1: 输入:root [1…

1. 问题描述:

给你二叉树的根节点 root 和一个整数 distance 。
如果二叉树中两个叶节点之间的最短路径长度小于或者等于 distance ,那它们就可以构成一组好叶子节点对 。
返回树中好叶子节点对的数量 。

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

输入:root = [100], distance = 1
输出:0

示例 5:

输入:root = [1,1,1], distance = 2
输出:1

2. 思路分析:

① 我感觉这道关于二叉树的题目是使用递归方法解决的非常好的题目,非常值得学习怎么样去解决,题目一看很容易理解,但是真的动手去做的时候发现会有点困难,而且一开始的时候发现找到一个合适的思路还是比较难的,于是理解了一下力扣官方的题解,自己编写几个简单的测试用例开启debug模式进行调试,但是发现官方有的解释得比较晦涩难懂而且debug之后还是比较难理解,理解很久之后还是有用一点思路的,于是尝试找一下比较好理解的题解与代码再理解一下,在力扣的评论区发现一个思路与官网的基本上是一样的java代码,最终还是理解了,发现这个思路真的好棒,这个对于后面我们遇到相关的问题是很有帮助的,可以借鉴一下其中的思路来解决类似需求的问题,自己理解之后转为了python代码,下面是我自己的一些理解

② 我感觉主要有以下几个巧妙的点,第一个巧妙之处是使用一个数组count来记录当前节点到叶子节点距离为i的叶子节点的数目,count数组的长度为len(distance) + 1(数组的索引表示的是当前节点到叶子节点的距离),而且题目中规定了距离是不超过10的所以每一次递归之前开辟的空间都是较小的,我们每一层都声明这样一个数组,并且利用当前节点递归返回的左右子树的count数组:也就是左右子树中距离为i的叶子节点的数目来更新当前节点下的距离为i的叶子节点数目,这样就可以利用递归从下往上返回的时候计算当前节点下左右子树的在distance之内的组合情况了(感觉这个count数组的长度设置也是很合理的,因为题目规定了距离是在distance之内的,所以计算在distance之内的叶子节点的数目才是有效的,超过了这个distance就无效了)

感觉开辟的这个数组有点动态规划的味道,其实理解这个数组的含义对于理解代码还是很有帮助的

第二个巧妙之处是当递归完左右子树返回到当前根节点的时候,将当前根节点下的所有叶子节点的距离都实现了加1的操作,下面的代码很巧妙地实现了这一点(因为在递归调用完成之后退回到上一层的时候距离肯定是比下一层节点到叶子节点的距离是加1的):

将当前节点的左右子树到达叶子节点的数目累加到当前节点的count数组上,并且在累加的时候实现了当前节点到叶子节点的距离加1的操作(核心是 i - 1累加到i位置上这样就可以实现距离值加1),所以在层层返回的时候就实现了当前节点到叶子节点的距离和节点数目的更新,这样最后我们每一次层层返回到当前根节点的时候count数组才是正确的,这也恰恰验证了这个数组的含义了

第三个点是我们在返回到当前根节点的时候对左右子树进行组合(也就是将左右子树对应的叶子节点数目相乘),将当前节点的左右子树在distance之内的叶子的组合的数目累加到结果中,所以在递归的方法中需要返回一个参数就是当前节点下的count数组,记录当前节点到各个叶子节点的距离值,这样在层层返回的时候才可以计算当前节点下的满足条件的左右叶子节点的数目,假如一对叶子节点是好叶子节点那么它应该是左叶子节点与右节节点的距离值是在distance之内的,所以需要使用两层for循环来计算组合的情况,i, j分别表示的左叶子节点的距离与右叶子节点距离的组合(相乘表示左右叶子节点的组合情况),这里又涉及到边界的问题最简单的方法是写出具体的例子画出一棵简单的二叉树就可以确定了,比如i = 1,distance = 3,j的最大距离肯定是小于等于2的,也就是j = distance - i + 1

3. 代码如下:

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution:res = 0def dfs(self, root: TreeNode, distance: int):# count数组含义表示的是当前的根节点到叶子节点距离为i的叶子节点数目count = [0] * (distance + 1)if not root.left and not root.right:# 距离为1的叶子节点的数目为1count[1] = 1return countleftCount, rightCount = [0] * (distance + 1), [0] * (distance + 1)if root.left:leftCount = self.dfs(root.left, distance)if root.right:rightCount = self.dfs(root.right, distance)# 对于边界问题最简单的是写出几个具体的例子来确定for i in range(1, distance):for j in range(1, distance - i + 1):# 通过左右子树的叶子节点的数目相乘那么就可以表示当前节点下的左右子树的组合情况self.res += leftCount[i] * rightCount[j]# 在层层返回的时候使每个叶子节点到当前节点的距离加1for i in range(2, distance + 1):count[i] = leftCount[i - 1] + rightCount[i - 1]return countdef countPairs(self, root: TreeNode, distance: int) -> int:self.dfs(root, distance)return self.res

 

http://www.lbrq.cn/news/932041.html

相关文章:

  • 用wordpress建公司网站步骤/广告招商
  • 百度给做网站收费多少/今日新闻国际最新消息
  • 上海网站建设微信开发/重庆seo招聘
  • 做网站交易平台挣钱吗/东莞seo托管
  • 阿里云建设网站好不好/软文是什么意思通俗点
  • 管理网站建设/培训机构招生7个方法
  • 安装wordpress没有选择语言/seo推广优化培训
  • html个人网站设计模板/茂名百度seo公司
  • 凡客建站网/免费网站推广网站破解版
  • 代做一个网站多少钱/网络营销专业技能
  • 做网站需要哪些东西/产品推广活动策划方案
  • 国内网站有哪些/seo推广专员
  • 网站动画用什么程序做/舆情监测软件
  • 网站开发概要设计/深圳营销推广公司
  • pc网站怎么做自适应/广东seo推广
  • mooc 网站建设情况/seo是什么姓
  • ps做网站效果图都是按几倍做/个人建网站步骤
  • 网站建设需要什么软件/seo搜索引擎优化课程总结
  • 赣州网站制作找哪家好/网络服务提供者不是网络运营者
  • 有域名了怎么做网站/企业软文范例
  • 怎么做网站详情页/宁波seo在线优化哪家好
  • 宁波网站建设制作订做/常州网站建设
  • 个人怎么做网站页面/seo单页快速排名
  • 网站设计师要求/武汉seo哪家好
  • 济南网站制作费用/亚马逊开店流程及费用
  • wap网站开发价格/软件推广
  • 深圳商城网站制作公司/seo百度推广
  • 兰州网站运营/工具
  • 县城购物网站/搜图片百度识图
  • 网站设计需求表/昆明百度推广优化
  • 机试01-C++基础语法与库函数
  • spring boot + mybatis + mysql 只有一个实体类的demo
  • Go语言常用的设计模式
  • c#中switch case语句的用法
  • Dify 从入门到精通(第 6/100 篇):配置你的第一个 LLM:OpenAI、Claude 和 Ollama
  • 深度学习与图像处理案例 │ 图像分类(智能垃圾分拣器)