50
50
51
51
<!-- 这里可写通用的实现逻辑 -->
52
52
53
+ ** 方法一:自底向上的递归**
54
+
55
+ 定义函数 $height(root)$ 计算二叉树的高度,处理逻辑如下:
56
+
57
+ - 如果二叉树 $root$ 为空,返回 $0$。
58
+ - 否则,递归计算左右子树的高度,分别为 $l$ 和 $r$。如果 $l$ 或 $r$ 为 $-1$,或者 $l$ 和 $r$ 的差的绝对值大于 $1$,则返回 $-1$,否则返回 $max(l, r) + 1$。
59
+
60
+ 那么,如果函数 $height(root)$ 返回的是 $-1$,则说明二叉树 $root$ 不是平衡二叉树,否则是平衡二叉树。
61
+
62
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉树的节点数。
63
+
53
64
<!-- tabs:start -->
54
65
55
66
### ** Python3**
64
75
# self.left = left
65
76
# self.right = right
66
77
class Solution :
67
- def isBalanced (self , root : TreeNode) -> bool :
78
+ def isBalanced (self , root : Optional[ TreeNode] ) -> bool :
68
79
def height (root ):
69
80
if root is None :
70
81
return 0
@@ -131,8 +142,8 @@ class Solution {
131
142
* @return {boolean}
132
143
*/
133
144
var isBalanced = function (root ) {
134
- let height = function ( root ) {
135
- if (root == null ) {
145
+ const height = root => {
146
+ if (! root) {
136
147
return 0 ;
137
148
}
138
149
const l = height (root .left );
@@ -142,7 +153,6 @@ var isBalanced = function (root) {
142
153
}
143
154
return 1 + Math .max (l, r);
144
155
};
145
-
146
156
return height (root) >= 0 ;
147
157
};
148
158
```
@@ -164,15 +174,19 @@ var isBalanced = function (root) {
164
174
class Solution {
165
175
public:
166
176
bool isBalanced(TreeNode* root) {
177
+ function<int(TreeNode* )> height = [ &] (TreeNode* root) {
178
+ if (!root) {
179
+ return 0;
180
+ }
181
+ int l = height(root->left);
182
+ int r = height(root->right);
183
+ if (l == -1 || r == -1 || abs(l - r) > 1) {
184
+ return -1;
185
+ }
186
+ return 1 + max(l, r);
187
+ };
167
188
return height(root) >= 0;
168
189
}
169
-
170
- int height(TreeNode* root) {
171
- if (!root) return 0;
172
- int l = height(root->left), r = height(root->right);
173
- if (l == -1 || r == -1 || abs(l - r) > 1) return -1;
174
- return 1 + max(l, r);
175
- }
176
190
};
177
191
```
178
192
@@ -188,32 +202,28 @@ public:
188
202
* }
189
203
*/
190
204
func isBalanced(root *TreeNode) bool {
191
- return height (root) >= 0
192
- }
193
-
194
- func height (root *TreeNode ) int {
195
- if root == nil {
196
- return 0
197
- }
198
- l , r := height (root.Left ), height (root.Right )
199
- if l == -1 || r == -1 || abs (l-r) > 1 {
200
- return -1
205
+ var height func(*TreeNode) int
206
+ height = func(root *TreeNode) int {
207
+ if root == nil {
208
+ return 0
209
+ }
210
+ l, r := height(root.Left), height(root.Right)
211
+ if l == -1 || r == -1 || abs(l-r) > 1 {
212
+ return -1
213
+ }
214
+ if l > r {
215
+ return 1 + l
216
+ }
217
+ return 1 + r
201
218
}
202
- return 1 + max (l, r)
219
+ return height(root) >= 0
203
220
}
204
221
205
222
func abs(x int) int {
206
- if x >= 0 {
207
- return x
208
- }
209
- return -x
210
- }
211
-
212
- func max (a , b int ) int {
213
- if a > b {
214
- return a
223
+ if x < 0 {
224
+ return -x
215
225
}
216
- return b
226
+ return x
217
227
}
218
228
```
219
229
0 commit comments