Given the root of a binary tree, return the length of the longest consecutive path in the tree.
A consecutive path is a path where the values of the consecutive nodes in the path differ by one. This path can be either increasing or decreasing.
For example, [1,2,3,4] and [4,3,2,1] are both considered valid, but the path [1,2,4,3] is not valid.
On the other hand, the path can be in the child-Parent-child order, where not necessarily be parent-child order.
Example 1:
Input: root = [1,2,3]
Output: 2
Explanation: The longest consecutive path is [1, 2] or [2, 1].
Example 2:
Input: root = [2,1,3]
Output: 3
Explanation: The longest consecutive path is [1, 2, 3] or [3, 2, 1].
Constraints:
The number of nodes in the tree is in the range [1, 3 * 104].
-3 * 104 <= Node.val <= 3 * 104
Solutions
Solution 1
Thinking
A path may bend at a node and may increase or decrease, so it is not a one-way parent-to-child chain. Restarting a search at every node repeats work.
DFS returns the longest increasing and decreasing runs that start at this node and go toward the parent. A child whose value differs by \(1\) extends the matching run. The answer is \(incr+decr-1\) (the node is counted twice). Only one-sided lengths go upward.
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */funclongestConsecutive(root*TreeNode)int{ans:=0vardfsfunc(root*TreeNode)[]intdfs=func(root*TreeNode)[]int{ifroot==nil{return[]int{0,0}}incr,decr:=1,1left:=dfs(root.Left)right:=dfs(root.Right)ifroot.Left!=nil{ifroot.Left.Val+1==root.Val{incr=left[0]+1}ifroot.Left.Val-1==root.Val{decr=left[1]+1}}ifroot.Right!=nil{ifroot.Right.Val+1==root.Val{incr=max(incr,right[0]+1)}ifroot.Right.Val-1==root.Val{decr=max(decr,right[1]+1)}}ans=max(ans,incr+decr-1)return[]int{incr,decr}}dfs(root)returnans}