我报名参加金石计划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. 最长同值路径
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~
无法复制加载中的内容