原题链接:543. 二叉树的直径 - 力扣(LeetCode)
题目描述: 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
什么是任意两点路径长的最大值呢?就是找到一条路,这条路上的节点数最多,也就是两个端点的路径最长,最长路径为节点数-1;
如下图示例1所示:
最长路径为[4,2,1,3] 或者[5,2,1,3],每条路径有4个节点,路径长度就为3。而且起始节点和终止节点肯定是叶子(如果数有两个分叉的话,如果有一个分叉肯定是最大深度)。
如果一个树有两个分叉,如示例1,那么节点1的最子树深度为2,右子树深度为1. 总和为3。
如果树只有一个分叉,那么最大深度就是根节点到叶子节点的深度。
综上:我们只需要遍历每个节点,然后看每个节点的最子树深度+右子树深度就行了。
class Solution {
int max = -1;
public int diameterOfBinaryTree(TreeNode root) {
if (root == null) {
return 0;
}
dfs(root);
return max;
}
private int dfs(TreeNode root) {
if (root == null) {
return -1;
}
// 左子树深度
int left = dfs(root.left)+1;
// 右子树深度
int right = dfs(root.right)+1;
// 最大值
max = Math.max(max, left + right);
// 返回一个根几点的最大深度。
return Math.max(left, right) + 1;
}
}
下图代码就是求树的最大深度。对比一下,就是少了max = Math.max(max,left + right);
多叉树的最大直径呢?其实多叉树路径的最大值就是,top2之和,就是一个根节点的第一长子树+第二长子树。
其中x表示根节点,edges 存储的是叶子节点。
int ans = 0;
private int dfs(int x, List<Integer>[] edges) {
int x_len = 0;
for (int y : edges[x]) {
int y_len = dfs(y, edges) + 1;
ans = Math.max(ans, x_len + y_len);
// 前面枝的最大值。
x_len = Math.max(x_len, y_len);
}
return x_len;
}
2246. 相邻字符不同的最长路径 - 力扣(LeetCode)可以试试这个题