LeetCode-687-最长同值路径
给定一个二叉树的 root
,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。
两个节点之间的路径长度 由它们之间的边数表示。
示例 1:
输入:root = [5,4,5,1,1,5]
输出:2
示例 2:
输入:root = [1,4,5,4,4,5]
输出:2
提示:
- 树的节点数的范围是
[0, 104]
-1000 <= Node.val <= 1000
- 树的深度将不超过
1000
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int max = 0;
/**
* DFS
* 在遍历过程中, 记录以当前节点作为左右孩子连接点时的长度, 以及以当前节点左右孩子节点中的最大长度
*/
public int longestUnivaluePath(TreeNode root) {
dfs(root);
return max;
}
private int dfs(TreeNode node) {
if (node == null) {
return 0;
}
int left = dfs(node.left), right = dfs(node.right);
// 如果子节点与当前节点值相同, 则长度 +1, 否则长度为 0
if (node.left != null && node.val == node.left.val) {
left++;
} else {
left = 0;
}
if (node.right != null && node.val == node.right.val) {
right++;
} else {
right = 0;
}
// 比较以当前节点为左右孩子连接点的长度与当前最大值
max = Math.max(max, left + right);
// 返回左右孩子中, 长度最大的
return Math.max(left, right);
}
}