タイトルの説明
ACコード
各ノードを通過するパスの最大値を列挙し、この値に従ってグローバル直径を更新します。最終的な結果は直径です。左サブツリーと右サブツリーは独立しているため、現在のノードの最大パスを取得するには、左パスの最大値と右パスの最大値を取得してから追加するだけで済みます。実際、左サブツリーと右サブツリーを見つけることです。深さの合計。
注:タイトルにも記載されています。ルートノードを経由する必要はありません。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int len=0;
public int diameterOfBinaryTree(TreeNode root) {
dfs(root);
return len;
}
int dfs(TreeNode root){
if(root==null)
return 0;
int left=dfs(root.left);
int right=dfs(root.right);
//更新最长的直径
len=Math.max(len,left+right);
//从当前节点往下走的最大值(从这个点向下往左和往右走中取最大的)
return Math.max(left+1,right+1);
}
}