Leetcode 687. 最长同值路径

90 阅读1分钟

题目地址

解题思路

首先需要明确一点:首先路径是一条没有分叉的节点连线,那么在递归的过程中如果遇到分叉我们需要向两个方向往下,但是回朔的时候仅取两个方向中路径较长的那一个。
本题属于二叉树的递归遍历,所以使用递归三部曲进行分析:
参数和返回值:参数为当前节点和上一节点的值,返回值为路径长度;
结束条件:当遍历到根节点的时候,停止递归;
单层遍历逻辑:
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
}