687. 最长同值路径:递归

220 阅读3分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第8篇文章,点击查看活动详情

一、题目描述:

继续咱们的每日一题,继续刷 687. 最长同值路径

二、这道题考察了什么思想?你的思路是什么?

一看又是一道二叉树的题目,相信我们也很熟悉二叉树的基本做法了

题目中给出的一棵二叉树,节点的值是整型的,题目要求我们计算节点值相同的连着的最长路径,节点相互连接,记作 1 个长度

  • 我们可以将整棵树的 root 节点加进来计算

分析

如何来思考这个题呢,我们知道对于二叉树,条件反射就能想到深度优先算法,和广度优先算法,那么这个题,要求我们计算相同节点值的最长路径,咱们还是离不开一个节点的左子和右子节点,可以这样来考虑

对于一个节点,这个节点下的孩纸节点和自己相连,如果左孩纸的值和当前节点的值相同,则 left +1,同理,对于右孩纸也是如此,则 right+1

那么同理,对于 当前节点的左右孩纸,以他们为根节点的时候,他的左右孩纸相同值的最长路径计算也是如此

这个时候,我们就可以使用深度优先的方式来进行处理了,例如我们可以这样

问题已经被简化到,只需要咱们关注一个节点的左子结果,右子结果,以及当前节点的左子是否和自己相等,右子是否和自己相等

按照这个图的简单理解,咱们能够明白,实际上关注好咱们节点的左子有右子即可,但是此题是需要我们记录整棵树的相等值的最长路径,因此,咱们在遍历的过程中需要记录最大值,进行比较,具体的咱们就可以来手撸代码,仔细检视一波

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

  • 咱们本次使用深度优先算法,重点关注每一个当前节点的左子结果和右子结果

编码如下:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

func longestUnivaluePath(root *TreeNode) int {
    res := 0
    var dfs func(*TreeNode)int
    dfs = func(root *TreeNode) int {
        if root == nil {
            return 0
        }
        // 计算当前节点的左节点和右节点的满足条件的值
        left := dfs(root.Left)
        right := dfs(root.Right)

        left1,right1 := 0,0  
        // 计算当前节点的左节点或者 右节点是否和自己相等,若相等则 + 1  
        if root.Left !=nil && root.Left.Val == root.Val{
            left1 = left +1
        }
        if root.Right !=nil && root.Right.Val == root.Val{
            right1 = right +1
        }
        // 记录整棵树值相同的最大路径长度
        res = max(res , left1+right1)
        return max(left1, right1)
    }

    dfs(root)
    return res

}
func max(a,b int) int {
    if a>b {
        return a
    }
    return b
}

四、总结:

咱们本次的实现方式,时间复杂度是 O(n) ,咱们需要遍历整棵树,即 n 个节点

空间复杂度是 O(n) ,咱们使用的是递归的方式,递归需要消耗栈空间

原题地址:687. 最长同值路径

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

无法复制加载中的内容