687. 最长同值路径

题目描述

给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。

注意:两个节点之间的路径长度由它们之间的边数表示。

示例

输入:

              5
             / \
            4   5
           / \   \
          1   1   5
输出:
2

思路

1.可以根据题意推导出本题的公式:rootPathVal = Math.max(leftPathVal,rightPathVal)。
2.可以看出此题可以使用递归思想求解。
3.若leftVal == rootVal,则leftPathVal = leftPathVal + 1,否则leftVal = 0 ,因为只有相同时,leftVal才可以作为同路径的参考;rightVal也是同理。

Java代码实现

class Solution {
    private int res = 0;
    public int longestUnivaluePath(TreeNode root) {
        if(root == null){
            return 0;
        }
        longestUnivaluePathBFS(root);
        return res;
    }

    public int longestUnivaluePathBFS(TreeNode root) {
        if(root == null){
            return 0;
        }

        int left = longestUnivaluePathBFS(root.left);
        int right = longestUnivaluePathBFS(root.right);

        if(root.left != null && root.left.val == root.val){
            left = left + 1;
        }else{
            left = 0;
        }

        if(root.right != null && root.right.val == root.val){
            right = right + 1;
        }else{
            right = 0;
        }

        res = Math.max(res,left+right);

        return Math.max(left,right);
    }
}

Golang代码实现

var maxVal int = 0

func longestUnivaluePath(root *TreeNode) int {
    longestUnivaluePathBFS(root)
    return maxVal
}

func longestUnivaluePathBFS(root *TreeNode) int {
    if root == nil{
        return 0
    }

    left := longestUnivaluePathBFS(root.Left)
    right := longestUnivaluePathBFS(root.Right)

    if root.Left != nil && root.Left.Val == root.Val{
        left = left + 1
    }else {
        left = 0
    }

    if root.Right != nil && root.Right.Val == root.Val{
        right = right + 1
    }else {
        right = 0
    }

    if left+right>maxVal{
        maxVal = left+right
    }

    if left>right {
        return left
    }else {
        return right
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
搜索部 首先说下timeline8.18,投递8.19,约一面8.21,晚上一面call约二面8.22,上午二面下午oc周末等待(8.23,8.24)8.25,offer一年前,我还是懵懵懂懂,高考完的暑假,只会提前学学高数,未来的画像是什么?我或许无法预测。开学后,自学Python,接单,无数个客户的ddl,偷偷摸摸一个人找自习的地方,这一步步竟然为后来的我,搭建工程能力的基础。大一上,我也要感谢我的第一位老板,让我接触到了实习,师兄带着我一步步入门,看他们写的飞书文档。大一下,导师带我参与企业项目,这让我渐渐发现,应该去实践,增长见识,而非局限当下,盯着自己的小新pro。不久后,第一波投递开始,结果当然是约面极少。盯着简历上的文字和ssob,我开始思考,确实很多可以去提升。带着些许不甘心,继续沉淀,慢慢的约面也越来越多,有的时候两天7场,准备完就接着下一个日程。这一次,也许是刚好到位吧,比较match,面试答的流利,关关难关关过,成为度孝子展望未来,依然是重重挑战,果然只有收到offer的那一刻是开心的。愿在百度星海拆解的每一段代码,都能成为丈量宇宙的诗行;此志终赴星河,而今迈步重铸天阶。屏幕前的你们,在无数个向星海奔赴的日夜,一定一定,会在未来化作群星回响的征程——请永远相信此刻埋首耕耘的自己!!!
一天三顿半:???百度提前批发 offer了?不是统一和正式批排序完再发吗我靠
百度求职进展汇总
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务