给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例 1:
1 2 3 4 5 6 7 8
| 输入: 5 / \ 4 5 / \ \ 1 1 5 输出: 2
|
示例 2:
1 2 3 4 5 6 7 8
| 输入: 1 / \ 4 5 / \ \ 4 4 5 输出: 2
|
注意:
给定的二叉树不超过10000个结点。 树的高度不超过1000。
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution { public int longestUnivaluePath(TreeNode root) { if (root == null) return 0; int res = help(root.left, root.val) + help(root.right, root.val); int left = longestUnivaluePath(root.left); int right = longestUnivaluePath(root.right); int max = res > left ? res : left; max = max > right ? max : right; return max;
}
public int help(TreeNode root, int parent) { if (root == null) return 0; int res = 0; if (root.val == parent) res += 1; else return 0; int left = help(root.left, parent); int right = help(root.right, parent); res += left > right ? left : right; return res; }
}
|
其他
这道题咋一看没思路,后面发现例题中三个节点相等时结果为2,也就是两条连接线.
- 注1.而且节点的父节点值跟自己相等时,连接数应该+1.
- 注2.这个路径同一个节点不能分叉,所以只能取其中一条分支的连接数累加上来.
- 注3.并且为了保证是相连的,如果遇到和父节点值不一样的,直接return.
- 注4.遍历所有节点,取最大值