解题思路
首先需要明确一点:首先路径是一条没有分叉的节点连线,那么在递归的过程中如果遇到分叉我们需要向两个方向往下,但是回朔的时候仅取两个方向中路径较长的那一个。
本题属于二叉树的递归遍历,所以使用递归三部曲进行分析:
参数和返回值:参数为当前节点和上一节点的值,返回值为路径长度;
结束条件:当遍历到根节点的时候,停止递归;
单层遍历逻辑:
1. 使用后序遍历,遍历至根节点后开始统计路径长度
2. 当前节点的路径大于之前的节点时,则进行替换
3. 如何当前节点的值等于上一节点的值的时候,取左右路径的最大值进行返回
示例代码
func longestUnivaluePath(root *TreeNode) int {
if root == nil {
return 0
}
res := 0
var dfs func(node *TreeNode, ta int) int
dfs = func(node *TreeNode, ta int) int {
if node == nil {
return 0
}
left := dfs(node.Left, node.Val)
right := dfs(node.Right, node.Val)
if left+right > res {
res = left + right
}
if node.Val == ta {
if left > right {
return left + 1
}
return right + 1
}
return 0
}
dfs(root, -1)
return res
}