【路飞】算法与数据结构-最长同值路径

133 阅读1分钟

不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

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;
};