[路飞][LeetCode]687_最长同值路径

286 阅读1分钟

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

给定一个二叉树的 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

解题思路

  • 对于当前节点,左子树能提供的长度为l,如果当前节点值等于左子节点的值,则左链的长度等于l+1,否则为0
  • 对于当前节点,右子树能提供的长度为r,如果当前节点值等于右子节点的值,则右链的长度等于r+1,否则为0
  • 当前子树对父节点提供的最大长度为左右链中较大的一个
  • 当前子树的左右链之和,去和全局最大值比较,试图更新它

解题代码

var longestUnivaluePath = function(root) {
    let res = 0

    const dfs = (node)=>{
        if(!node) return 0
        const l = dfs(node.left)
        const r = dfs(node.right)
        let left = 0
        let right = 0 
        if(node.left&&node.left.val == node.val) {left = l+1}
        if(node.right&&node.right.val == node.val){right = r+1}
        res = Math.max(res,left+right)
        return Math.max(left,right)
    }
    dfs(root)
    return res
};

如有任何问题或建议,欢迎留言讨论!