[LeetCode-Golang] 687. 最长同值路径
题目
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
解题思路
1.后序遍历二叉树,设置最大值变量
2.以某节点为根节点,如果它的左(右)孩子存在且值与该节点相同,那么该节点的最长同源路径+=以左(右)孩子为根节点的的最长同源路径+1,否则+=0。
3.遍历的过程中,如果当前节点为根节点的最长同源路径>最大值,则更新最大值
4.注意节点向其根节点返回的是其左孩子和右孩子到该节点最长同源路径的最大值,而不是和(路径不能出现分叉)。
代码
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ // 全局变量保存结果 var ans int func longestUnivaluePath(root *TreeNode) int { ans = 0 helper(root) return ans } func helper(root *TreeNode) int { // 递归终止条件 if root == nil { return 0 } // 递归求root的左子树的最长同值路径(值==root.Left.Val) leftLen := helper(root.Left) // 递归求root的右子树的最长同值路径(值==root.Right.Val) rightLen := helper(root.Right) // 如果root.Val == root.Left.Val则root的左子树到root的最长同源路径为leftLen+1,否则为0 if root.Left != nil && root.Left.Val == root.Val { leftLen += 1 } else { leftLen = 0 } // 同理求右子树到root的最长同源路径 if root.Right != nil && root.Right.Val == root.Val { rightLen += 1 } else { rightLen = 0 } // root的最长同源路径为左右子树最长同源路径之和,如果>ans,则更新 ans = maxInt(ans, leftLen + rightLen) // 注意向root的父节点返回的是root的leftLen,rightLen的最大值,而不是和 return maxInt(leftLen, rightLen) } func maxInt(a, b int) int { if a < b { return b } return a }
复杂度分析
时间复杂度:O(n) n是树中节点个数
空间复杂度:O(h) h是树的高度