【Leetcode 687】递归求最大相同路径
类型:Easy, 递归
题目描述:
Given a binary tree, find the length of the longest path where each node in the path has the same value. This path may or may not pass through the root.
Note: The length of path between two nodes is represented by the number of edges between them.
Example 1:
Input:
5/ \4 5/ \ \1 1 5
Output:
2
Example 2:
Input:
1/ \4 5/ \ \4 4 5
Output:
2
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = Noneclass Solution:def longestUnivaluePath(self, root):""":type root: TreeNode:rtype: int"""self.max_path = 0if root == None:return 0self.recursive_find(root)return self.max_pathdef recursive_find(self,root):if root == None:return 0left = self.recursive_find(root.left)right = self.recursive_find(root.right)if (root.left != None and root.val == root.left.val):left += 1elif (root.left != None): # 只是非空left = 0if (root.right != None and root.val == root.right.val):right += 1elif (root.right != None):right = 0if left + right > self.max_path:self.max_path = left + rightreturn max(left, right)
能用递归解决问题的,一定是自顶向下。
那么这个问题也是,站在当前结点上思考,左子树的最长路径已经知道了,右子树的最大路径也已经知道了。那么,现在需要做的决策是,结合当前结点值,如何更新最大的路径长度 。用left标记左子树的最大路径长度,right标记右子树的最大路径长度。
第一种情况,左子树非空,且左子树的根结点与当前结点值相同,那么left+1;否则,将left置为0,因为现在考虑的是对max_path是否增量更新。另外一种担忧是,最长路径不一定经过根结点,为什么判断的子树根结点和当前结点值相同时就可以加1呢?这个要从递归会递归到终结退出条件来思考,逐层向上展开。
同样的,右子树思考路径对称过去即可。
现在开始更新最大路径,left + right > max_path吗?
如果当前结点的值与左子树根结点值,右子树结点值都相同,那么left自增1,右子树自增1,合起来最长路径增加2.
如果只有一个子树的根结点值与当前结点值相同,则只有单边子树自增1,另外一个子树的大小置为0。
END.
【Leetcode 687】递归求最大相同路径相关推荐
- LeetCode 687. 最长同值路径(二叉树,递归)
1. 题目 给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值. 这条路径可以经过也可以不经过根节点. 注意:两个节点之间的路径长度由它们之间的边数表示. 示例 1: 输入:5/ \4 5 ...
- Leetcode 687.最长同值路径
Time: 20190901 Type: Easy 题目描述 给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值. 这条路径可以经过也可以不经过根节点. 注意:两个节点之间的路径长度由它们 ...
- leetcode —— 687. 最长同值路径
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值. 这条路径可以经过也可以不经过根节点. 注意:两个节点之间的路径长度由它们之间的边数表示.. -------------- 解题思路:使 ...
- 消除左递归c++代码_「leetcode」129. 求根到叶子节点数字之和【递归中隐藏着回溯】详解...
链接 https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/ 思路 本题和113.路径总和II是类似的思路,做完这道题,可以顺便把113. ...
- [LeetCode]124. 二叉树中的最大路径和(java实现)递归
[LeetCode]124. 二叉树中的最大路径和(java实现)递归 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总 ...
- 49 - 算法 - LeetCode 110 平衡二叉树 - 求二叉树的高度 -双重递归
// 求二叉树的高度函数 nullptr为0 然后累加 +1 return left-right // 结论都还是递归 当前状态 多加了一个递归求高度 双重递归 class Solution {pub ...
- LeetCode 70爬楼梯71简化路径72编辑距离(dp)
新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注这个潇洒青年一起飞,回 ...
- 递归求嵌套数组中最大值
今早在 https://attachments.me/hirehack/public/computer.html 做题,有一题是 递归求嵌套数组中最大值: /* This challenge requ ...
- 递归求最值(分治递归)
输入n,再输入n个数,输出n个数中的最小值和最大值. 分治与递归! 代码: #include<iostream>using namespace std; void minmax(int * ...
最新文章
- Python—sqlalchemy
- android 画布旋转,Android-在安卓开发中,如何实现一个简单的图片旋转
- 在linux命令行 下学习编写java
- 搞懂深浅拷贝JavaScript内存之栈和堆
- 如何成立一家私募基金公司
- elk 搜索 语法_ELK学习笔记7| Lucence 的搜索语法
- WPF 实现ScrollViewer的垂直偏移滚动跳转
- 【转】[caffe]深度学习之图像分类模型AlexNet解读
- 信息学奥赛一本通 2059:【例3.11】买笔
- windows 下使用 nc 命令报错,与 Linux 不同。
- linux下tomcat发布网站验证码获取不到
- python epoll多路复用技术_python网络编程——IO多路复用之epoll
- 页面加载速度优化的建议
- 抄答案就是了,两套详细的设计方案,解决头疼的支付掉单问题
- Win10打开文件夹闪退怎么解决
- 生物药、创新药、仿制药新项目立项调研、评估的重要手段
- MITK中窗宽窗位相关代码
- Myeclipse错误: 找不到或无法加载主类 Dmaven.multiModuleProjectDirectory=$M2_HOME
- Ruby学习之日期 时间(Date Time)范围(Range)的定义和使用
- webgis期末考试试题_《WebGIS课程》期末考试复习资料
热门文章
- Ubuntu学习日记--Lesson10:gcc、make、makefile、cmake、cmakelists区别
- Modules Of YoloV5 Architecture
- 常见经典排序算法学习总结(插入、shell、冒泡、选择、归并、快排等)
- stl之multiset容器的应用
- glusphere设置球位置_玄武区举办桌上冰壶球比赛暨江苏省桌上冰壶球俱乐部联赛(玄武区站)活动...
- 360优化开机速度后慢了_提高电脑开机速度的优化技巧
- mysql2表连接优化性能_MySQL性能优化方法二:表结构优化
- ubuntu update和install失败,一种可以能的解决方法
- 网易云api接口_网易云音乐你喜欢吗?你自己也可以做一个
- Java break语句,标签