题目地址:
https://www.lintcode.com/problem/diameter-of-binary-tree/description
给定一棵二叉树,求其直径。
思路是DFS。每到一个节点的时候,就算一下以当前节点为最高节点的最长路径节点个数,那么就需要左子树根到叶子的最长路径节点个数加上右子树根到叶子的最长路径节点个数再加上 1 1 1,而这可以通过递归来求得。算完了以后更新答案即可。代码如下:
public class Solution {
private int res;
/**
* @param root: a root of binary tree
* @return: return a integer
*/
public int diameterOfBinaryTree(TreeNode root) {
// write your code here
dfs(root);
// 这里res是最长路径的节点个数,而路径长度还需要减去1
return res - 1;
}
// 返回从cur到叶子的最长路径长度
private int dfs(TreeNode cur) {
if (cur == null) {
return 0;
}
int left = dfs(cur.left), right = dfs(cur.right);
res = Math.max(res, 1 + left + right);
return 1 + Math.max(left, right);
}
}
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。