给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。
两个节点之间的路径长度 由它们之间的边数表示。
示例 1:

输入:root = [5,4,5,1,1,5]
输出:2
示例 2:

输入:root = [1,4,5,4,4,5]
输出:2
提示:
[0, 104]-1000 <= Node.val <= 10001000动态规划,
d
p
[
n
o
d
e
]
dp[node]
dp[node]表示以node为根,左右子树中最长相同路径长度,则
d
p
[
n
o
d
e
]
=
{
0
n
o
d
e
.
l
e
f
t
.
v
a
l
≠
n
o
d
e
.
v
a
l
∧
n
o
d
e
.
r
i
g
h
t
.
v
a
l
≠
n
o
d
e
.
v
a
l
d
p
[
n
o
d
e
.
l
e
f
t
]
+
1
n
o
d
e
.
v
a
l
=
n
o
d
e
.
l
e
f
t
.
v
a
l
∧
n
o
d
e
.
v
a
l
≠
n
o
d
e
.
r
i
g
h
t
.
v
a
l
d
p
[
n
o
d
e
.
r
i
g
h
t
]
+
1
n
o
d
e
.
v
a
l
=
n
o
d
e
.
r
i
g
h
t
.
v
a
l
∧
n
o
d
e
.
v
a
l
≠
n
o
d
e
.
l
e
f
t
.
v
a
l
max
(
d
p
[
n
o
d
e
.
l
e
f
t
]
+
1
,
d
p
[
n
o
d
e
.
r
i
g
h
t
]
+
1
)
n
o
d
e
.
l
e
f
t
.
v
a
l
=
n
o
d
e
.
r
i
g
h
t
.
v
a
l
=
n
o
d
e
.
v
a
l
dp[node] = \left\{
结果值则为递归过程中最大的 d p [ n o d e . l e f t ] + n o d e . r i g h t dp[node.left]+node.right dp[node.left]+node.right
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def longestUnivaluePath(self, root: Optional[TreeNode]) -> int:
ret = 0
def dfs(node: Optional[TreeNode]) -> int:
nonlocal ret
if not node:
return 0
left = dfs(node.left)
right = dfs(node.right)
leftLength = left + 1 if node.left and node.val == node.left.val else 0
rightLength = right + 1 if node.right and node.val == node.right.val else 0
ret = max(ret, leftLength + rightLength)
return max(leftLength, rightLength)
dfs(root)
return ret