目次
与えられた二分木が、高さのバランスがとれた二分木であるかどうかを判断します。
この質問では、高さのバランスがとれた二分木は次のように定義されます。
二分木の各ノードの左右のサブツリー間 の高さの差の絶対値は 1 を超えません。
例 1:
入力: root = [3,9,20,null,null,15,7] 出力: true例 2:
入力: root = [1,2,2,3,3,null,null,4,4] 出力: false例 3:
入力: root = [] 出力: trueヒント:
- ツリー内のノードの数は範囲内
[0, 5000]
です-104 <= Node.val <= 104
题解:
アイデアは104 にあります。バイナリ ツリーの最大の深さ - LeetCode
アイデアに基づいて完成した、対応する問題解決策はLeetCode アルゴリズム再帰クラス - バイナリ ツリーの最大深さ_turbo 夏 漱石のブログ - CSDN ブログ
- 深さを計算する関数 deep と結果を保存するブール型のグローバル変数 res を定義します。
- deep 関数を呼び出して深さを計算します
- deep 関数は、各レイヤーの深さを再帰的に計算し、左右のサブツリーの深さを比較します。
- 1 より大きい場合は、res 値を false に変更します。
代码:
class Solution { boolean res=true; public boolean isBalanced(TreeNode root) { deep(root); return res; } private int deep(TreeNode root){ if(root==null) return 0; int left=deep(root.left); int right=deep(root.right); if(Math.abs(left-right)>1){ res=false; } return Math.max(left,right)+1; } }
操作結果:
最適化されたバージョン 1:
class Solution { boolean res=true; public boolean isBalanced(TreeNode root) { deep(root); return res; } private int deep(TreeNode root){ if(root==null) return 0; int left=deep(root.left); int right=deep(root.right); if(Math.abs(left-right)>1){ res=false; return -1; } return Math.max(left,right)+1; } }
修正方法 2 と方法 1 の違いは、不均衡が見つかった場合に、グローバル変数 res を変更するのではなく、直接 -1 を返して計算を終了することです。そうすることで計算が早期に終了し、不必要な再帰呼び出しが回避され、結果がより早く決定される可能性があります。
操作結果: