Tree - 687. Longest Univalue Path
时间:2022-07-25
本文章向大家介绍Tree - 687. Longest Univalue Path,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
687. Longest Univalue Path
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.
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
Note: The given binary tree has not more than 10000 nodes. The height of the tree is not more than 1000.
思路:
题目意思是找出一个二叉树中值相同的路径的种数,树是天然的递归结构,所以题目几乎都可以用递归求解,仔细思考可以发现,对于任意一个节点,对父级节点,只有两种返回结果,一种是自己的和其中一个孩子节点值相同,向上返回对应的长度,一种是自己和两个子节点相同,那么像外层也就是父级节点返回的就是0,因为不允许路径交叉。所以可以看做一个后序遍历求解。
代码:
go:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func longestUnivaluePath(root *TreeNode) int {
if root == nil {
return 0
}
var res int
univaluePath(root, &res)
return res
}
func univaluePath(node *TreeNode, res *int) int {
if node == nil {
return 0
}
leftLen := univaluePath(node.Left, res)
rightLen := univaluePath(node.Right, res)
var leftPathLen, rightPathLen int
if node.Left != nil && node.Val == node.Left.Val {
leftPathLen = leftLen + 1
}
if node.Right != nil && node.Val == node.Right.Val {
rightPathLen = rightLen + 1
}
*res = max(*res, leftPathLen + rightPathLen)
return max(leftPathLen, rightPathLen)
}
func max(i, j int) int {
if i > j {
return i
}
return j
}
- Java8 Lambda表达式与Stream API (二): Stream API的使用你要知道的Java8 匿名内部类、函数式接口、lambda表达式与Stream API都在这里
- Python Garbage Collection 与 Objective-C ARCPython GC 与 Objective-C ARC
- SpringMVC DispatcherServlet执行流程及源码分析你要知道的SpringMVC DispatcherServlet执行流程及源码分析都在这里
- iOS runtime探究(三): 从runtime开始理解OC的属性property你要知道的runtime都在这里
- jQuery选择器大全(48个代码片段+21幅图演示)1
- KVC 使用方法详解及底层实现你要知道的KVC、KVO、Delegate、Notification都在这里
- jQuery选择器大全(48个代码片段+21幅图演示)2
- 神经网络-感知器
- NSNotificationCenter 通知的使用方法详解你要知道的KVC、KVO、Delegate、Notification都在这里
- Protocol与Delegate 使用方法详解你要知道的KVC、KVO、Delegate、Notification都在这里
- iOS多线程——你要知道的GCD都在这里你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里
- NSCopying和NSCoding对象序列化反序列化基础详解你要知道的NSCopying、NSCoding协议及对象序列化和反序列化都在这里
- KVO 正确使用姿势进阶及底层实现你要知道的KVC、KVO、Delegate、Notification都在这里
- iOS多线程——你要知道的NSOperation都在这里你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java学习笔记, 不断更新
- 这题真是送分——LeetCode题目12:整数转罗马数字
- 该了解一波了!零基础入门Nginx
- 轻松一刻——LeetCode题目13:罗马数字转整数
- 动动手——LeetCode题目14:最长公共前缀
- LeetCode题目15:三数之和
- 三数之和姊妹题——LeetCode题目16:最接近的三数之和
- 组合问题——LeetCode题目17:电话号码的字母组合
- Python读取PDF文档并翻译
- n数之和题目要类比——LeetCode题目18:四数之和
- SpringBoot使用MySQL访问数据
- MySQL数据库与JDBC编程
- 自动删除QQ空间指定好友的留言
- 在Ubuntu 18.04中安装VMware工具
- 微信小程序下拉刷新功能