この質問についての私の最初の考えは、各ノードの左右のサブツリーをトラバースすることでしたが、そのような方法はn ^ 2の時間計算量を持っています。私はより良い方法を考えなかったので、答えを見ました。
注文後のトラバーサル、剪定
左右のサブツリーの差が2より大きい場合、-1を返します。この-1は枝刈りに使用され、すべての再帰を直接終了します。このように、真偽の判断は-1かどうかの判断になります。
rootがnullの場合、直接0を返します。これは、場所によって提供される深さが0であることを意味します。
ただし、この計算方法では、各ノードは上からではなく下から上に深さを取得しますが、問題解決には影響しません。
public boolean isBalanced(TreeNode root) {
return recur(root)!=-1;
}
public int recur(TreeNode root){
if(root == null){
return 0;
}
int left = recur(root.left);
if(left == -1) return -1;
int right = recur(root.right);
if(right == -1) return -1;
return Math.abs(left-right)<2?Math.max(left,right)+1:-1;
}