不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。
LeetCode:原题地址
题目要求
给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。
两个节点之间的路径长度 由它们之间的边数表示。
示例 1:
输入: root = [5,4,5,1,1,5]
输出: 2
示例 2:
输入: root = [1,4,5,4,4,5]
输出: 2
提示:
- 树的节点数的范围是
[0, 104] -1000 <= Node.val <= 1000- 树的深度将不超过
1000
思路
- 定义递归函数:求值为 parentVal 的节点的最大深度
/**
* @param {TreeNode} root
* @return {number}
*/
var longestUnivaluePath = function (root) {
if (root == null) return 0;
let res = 0;
let maxDepth = (root, parentVal) => {
// 定义:计算以 root 为根的这棵二叉树中,从 root 开始值为 parentVal 的最长树枝长度
if (root == null) return 0;
// 利用函数定义,计算左右子树值为 root.val 的最长树枝长度
let leftLen = maxDepth(root.left, root.val);
let rightLen = maxDepth(root.right, root.val);
// 后序遍历位置顺便更新全局变量,同值路径就是左右同值树枝长度之和
res = Math.max(res, leftLen + rightLen);
// 如果 root 本身和上级值不同,那么整棵子树都不可能有同值树枝
if (root.val != parentVal) return 0;
// 以 root 为根的二叉树从 root 开始值为 parentVal 的最长树枝长度,等于左右子树的最长树枝长度的最大值加上 root 节点本身
return 1 + Math.max(leftLen, rightLen);
};
// 在后序遍历的位置更新 res
maxDepth(root, root.val);
return res;
};