687. 最长同值路径(一般)
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例 1:
输入: 5
/ \
4 5
/ \ \
1 1 5
输出:2
示例 2:
输入: 1
/ \
4 5
/ \ \
4 4 5
输出:2
注意: 给定的二叉树不超过10000个结点。 树的高度不超过1000。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-univalue-path
思路:
- 设计一个递归函数
- 递归函数的返回值
- 我们希望这个函数能够得到:从 node 节点开始,向下出发,最长的同值路径长度
- 因为路径的一个方向是通向 node 的父节点,所以另一个方向只能从 node 的左或右节点中选择至多一个
- 递归函数的出口
- 如果 node 为空,返回 0
- 递归函数的逻辑
- 当我们递归调用 node->left 和 node->right 时,就可以得到左/右子树与其数值相同节点的长度
- 只需要判断左/右子树的数值与根节点的数值是否相同,不相同的话就舍弃,相同的话长度就加一
- 那么与 node 值相同的路径长度就是左/右两条路中较长的
- 递归函数只能取得 node 的同值路径长度,这里还有一些其他情况需要考虑
- 如果最长的路径是由一个其他数值的子节点开始向下出发的情况,在递归中间因为数值不同被舍弃了
- 是由一个子节点,向左右两个方向同时向下出发的情况(情况 1)
- 在递归函数的参数中使用一个引用变量,记录全局最大值
- 当计算出一个节点的返回值时,将以这个节点,连接左右两边的路径长度,更新到全局最大值
- 然后再返回
- 这个全局最大值包含了以上所有情况,就是题目的答案
作者:ikaruga
链接:https://leetcode-cn.com/problems/longest-univalue-path/solution/687-by-ikaruga/
代码1:
1 | /** |