题目描述

image.png

解题思路

本题求的直径也就是两个节点之间的最大值,注意可以经过根节点,也可以不经过根节点,例如:
image.png
此时最大直径便不经过根节点。所以我们可以求每个节点的深度,再将左右两边深度相加减一就可以该节点的得到直径,但是由于直径不只经过根节点,所以需要使用一个变量ans来记录每个节点左右子树的最大深度,遇到最大则更新ans,最后返回ans-1,就是最长的直径。

注意返回值一定需要经过根节点,所以需要求出左右子树的最大直径加上根节点。而求每个节点的最大直径可以经过根节点,也可以不经过。

  1. class Solution {
  2. int ans = 0;
  3. public int diameterOfBinaryTree(TreeNode root) {
  4. if (root == null) return 0;
  5. getDepth(root);
  6. return ans - 1;
  7. }
  8. public int getDepth(TreeNode root) {
  9. if (root == null) return 0;
  10. int left = getDepth(root.left);
  11. int right = getDepth(root.right);
  12. ans = Math.max(ans, 1 + left + right);
  13. return 1 + Math.max(left, right);
  14. }
  15. }