[路飞]_最长同值路径

173 阅读2分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

687. 最长同值路径

题目

给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。 注意:两个节点之间的路径长度由它们之间的边数表示。

示例1

              5
             / \
            4   5
           / \   \
          1   1   5

输出: 2

注意:  给定的二叉树不超过10000个结点。 树的高度不超过1000。

题解

在leetcode上,递归能解决二叉树90%的题;

这题最容易想到的思路就是递归,

想到递归,需要考虑返回递归返回什么?

对于任意节点node

  • 如果节点为空,向上级节点返回0,因为此时当前节点的【最长的路径】就是0;
  • 如果节点不为空,递归获取节点左侧、右侧子节点【最长的路径】,这点比较重要,因为是这是递归的开始,获取的是节点的【最长路径】,所以此函数最后返回的一定是一个数值,数值表示节点得到的【最长路径】
  • 如果当前节点node的value值与当前节点的左侧子节点value值(node.left.value)相同,将获取到的当前左侧子节点【最长的路径+1保存到leftMax变量中,这个变量后期有重要用处。
  • 如果当前节点node的value值与当前节点的右侧子节点value值(node.right.value)相同,将获取到的当前右侧子节点【最长的路径】+1保存到rightMax变量中;
  • 从变量leftMax和rightMax中找到较大值。讲这个较大值返回到当前节点node的上级,作为node节点上级的子节点【最长的路径】
  • 在计算子节点【最长的路径】的递归算法中,同步保存计算到的子节点【最长的路径】最大值,保存到结果result变量
  • 返回result这个变量即可
graph TD
mid --> Left & Right

代码

var longestUnivaluePath = function(root) {
    
    let resule = 0
    getVal(root)
    function getVal(node){
        if (node == null) return 0;
        let left = getVal(node.left)
        let right = getVal(node.right)
        let leftMax = 0
        let rightMax = 0;
        if(node.left != null && node.left.val == node.val){
            leftMax+=left+1
        }
        if (node.right != null && node.right.val == node.val) {
            rightMax += right + 1;
        }
         resule = Math.max(resule, leftMax + rightMax);
        return  Math.max(leftMax, rightMax);
    }
    return resule 
};