42
42
43
43
## 解法
44
44
45
+ ** 方法一:递归**
46
+
47
+ 我们设计一个递归函数 ` dfs ` ,它接收两个参数 ` a ` 和 ` b ` ,分别代表两棵树的根节点。我们可以对 ` a ` 和 ` b ` 进行如下判断:
48
+
49
+ - 如果 ` a ` 和 ` b ` 都为空,说明两棵树都遍历完了,返回 ` true ` ;
50
+ - 如果 ` a ` 和 ` b ` 中有且只有一个为空,说明两棵树的结构不同,返回 ` false ` ;
51
+ - 如果 ` a ` 和 ` b ` 的值不相等,说明两棵树的结构不同,返回 ` false ` ;
52
+ - 如果 ` a ` 和 ` b ` 的值相等,那么我们分别递归地判断 ` a ` 的左子树和 ` b ` 的右子树,以及 ` a ` 的右子树和 ` b ` 的左子树是否对称。
53
+
54
+ 最后,我们返回 ` dfs(root, root) ` ,即判断 ` root ` 的左子树和右子树是否对称。
55
+
56
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉树的节点数。
57
+
45
58
<!-- tabs:start -->
46
59
47
60
### ** Python3**
57
70
58
71
class Solution :
59
72
def isSymmetric (self , root : TreeNode) -> bool :
60
- def is_symmetric ( left , right ):
61
- if left is None and right is None :
73
+ def dfs ( a , b ):
74
+ if a is None and b is None :
62
75
return True
63
- if left is None or right is None or left .val != right .val:
76
+ if a is None or b is None or a .val != b .val:
64
77
return False
65
- return is_symmetric(left.left, right.right) and is_symmetric(
66
- left.right, right.left
67
- )
78
+ return dfs(a.left, b.right) and dfs(a.right, b.left)
68
79
69
- if root is None :
70
- return True
71
- return is_symmetric(root.left, root.right)
80
+ return dfs(root, root)
72
81
```
73
82
74
83
### ** Java**
@@ -85,40 +94,47 @@ class Solution:
85
94
*/
86
95
class Solution {
87
96
public boolean isSymmetric (TreeNode root ) {
88
- if (root == null ) return true ;
89
- return isSymmetric(root. left, root. right);
97
+ return dfs(root, root);
90
98
}
91
99
92
- private boolean isSymmetric (TreeNode left , TreeNode right ) {
93
- if (left == null && right == null ) return true ;
94
- if (left == null || right == null || left. val != right. val) return false ;
95
- return isSymmetric(left. left, right. right) && isSymmetric(left. right, right. left);
100
+ private boolean dfs (TreeNode a , TreeNode b ) {
101
+ if (a == null && b == null ) {
102
+ return true ;
103
+ }
104
+ if (a == null || b == null || a. val != b. val) {
105
+ return false ;
106
+ }
107
+ return dfs(a. left, b. right) && dfs(a. right, b. left);
96
108
}
97
109
}
98
110
```
99
111
100
- ### ** JavaScript **
112
+ ### ** C++ **
101
113
102
- ``` js
114
+ ``` cpp
103
115
/* *
104
116
* Definition for a binary tree node.
105
- * function TreeNode(val) {
106
- * this.val = val;
107
- * this.left = this.right = null;
108
- * }
109
- */
110
- /**
111
- * @param {TreeNode} root
112
- * @return {boolean}
117
+ * struct TreeNode {
118
+ * int val;
119
+ * TreeNode *left;
120
+ * TreeNode *right;
121
+ * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
122
+ * };
113
123
*/
114
- var isSymmetric = function (root ) {
115
- function dfs (left , right ) {
116
- if (! left && ! right) return true ;
117
- if (! left || ! right || left .val != right .val ) return false ;
118
- return dfs (left .left , right .right ) && dfs (left .right , right .left );
124
+ class Solution {
125
+ public:
126
+ bool isSymmetric(TreeNode* root) {
127
+ function<bool(TreeNode* , TreeNode* )> dfs = [ &] (TreeNode* a, TreeNode* b) -> bool {
128
+ if (!a && !b) {
129
+ return true;
130
+ }
131
+ if (!a || !b || a->val != b->val) {
132
+ return false;
133
+ }
134
+ return dfs(a->left, b->right) && dfs(a->right, b->left);
135
+ };
136
+ return dfs(root, root);
119
137
}
120
- if (! root) return true ;
121
- return dfs (root .left , root .right );
122
138
};
123
139
```
124
140
@@ -134,55 +150,45 @@ var isSymmetric = function (root) {
134
150
* }
135
151
*/
136
152
func isSymmetric(root *TreeNode) bool {
137
- if root == nil {
138
- return true
139
- }
140
- return isSymme (root.Left , root.Right )
141
- }
142
-
143
- func isSymme (left *TreeNode , right *TreeNode ) bool {
144
- if left == nil && right == nil {
145
- return true
146
- }
147
- if left == nil || right == nil || left.Val != right.Val {
148
- return false
149
- }
150
- return isSymme (left.Left , right.Right ) && isSymme (left.Right , right.Left )
153
+ var dfs func(a, b *TreeNode) bool
154
+ dfs = func(a, b *TreeNode) bool {
155
+ if a == nil && b == nil {
156
+ return true
157
+ }
158
+ if a == nil || b == nil || a.Val != b.Val {
159
+ return false
160
+ }
161
+ return dfs(a.Left, b.Right) && dfs(a.Right, b.Left)
162
+ }
163
+ return dfs(root, root)
151
164
}
152
165
```
153
166
154
- ### ** C++ **
167
+ ### ** JavaScript **
155
168
156
- ``` cpp
169
+ ``` js
157
170
/**
158
171
* Definition for a binary tree node.
159
- * struct TreeNode {
160
- * int val;
161
- * TreeNode *left;
162
- * TreeNode *right;
163
- * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
164
- * };
172
+ * function TreeNode(val) {
173
+ * this.val = val;
174
+ * this.left = this.right = null;
175
+ * }
165
176
*/
166
- class Solution {
167
- public:
168
- bool isSymmetric(TreeNode* left, TreeNode* right) {
169
- // 均为空,则直接返回 true。有且仅有一个不为空,则返回 false
170
- if (left == nullptr && right == nullptr) {
177
+ /**
178
+ * @param {TreeNode} root
179
+ * @return {boolean}
180
+ */
181
+ var isSymmetric = function (root ) {
182
+ const dfs = (a , b ) => {
183
+ if (! a && ! b) {
171
184
return true ;
172
185
}
173
- if (left == nullptr || right == nullptr || left-> val != right-> val) {
186
+ if (! a || ! b || a . val != b . val ) {
174
187
return false ;
175
188
}
176
- return isSymmetric(left->left, right->right) && isSymmetric(left->right, right->left);
177
- }
178
-
179
- bool isSymmetric(TreeNode* root) {
180
- if (root == nullptr) {
181
- return true;
182
- }
183
-
184
- return isSymmetric(root->left, root->right);
185
- }
189
+ return dfs (a .left , b .right ) && dfs (a .right , b .left );
190
+ };
191
+ return dfs (root, root);
186
192
};
187
193
```
188
194
@@ -204,19 +210,16 @@ public:
204
210
*/
205
211
206
212
function isSymmetric(root : TreeNode | null ): boolean {
207
- if (root == null ) {
208
- return true ;
209
- }
210
- const dfs = (left : TreeNode | null , right : TreeNode | null ) => {
211
- if (left == null && right == null ) {
213
+ const dfs = (a : TreeNode | null , b : TreeNode | null ): boolean => {
214
+ if (! a && ! b ) {
212
215
return true ;
213
216
}
214
- if (left == null || right == null || left .val != right .val ) {
217
+ if (! a || ! b || a .val != b .val ) {
215
218
return false ;
216
219
}
217
- return dfs (left .left , right .right ) && dfs (left .right , right .left );
220
+ return dfs (a .left , b .right ) && dfs (a .right , b .left );
218
221
};
219
- return dfs (root . left , root . right );
222
+ return dfs (root , root );
220
223
}
221
224
```
222
225
@@ -241,27 +244,23 @@ function isSymmetric(root: TreeNode | null): boolean {
241
244
// }
242
245
// }
243
246
// }
244
- use std :: rc :: Rc ;
245
247
use std :: cell :: RefCell ;
248
+ use std :: rc :: Rc ;
246
249
impl Solution {
247
- fn dfs (left : & Option <Rc <RefCell <TreeNode >>>, right : & Option <Rc <RefCell <TreeNode >>>) -> bool {
248
- if left . is_none () && right . is_none () {
250
+ fn dfs (a : & Option <Rc <RefCell <TreeNode >>>, b : & Option <Rc <RefCell <TreeNode >>>) -> bool {
251
+ if a . is_none () && b . is_none () {
249
252
return true ;
250
253
}
251
- if left . is_none () || right . is_none () {
254
+ if a . is_none () || b . is_none () {
252
255
return false ;
253
256
}
254
- let l = left . as_ref (). unwrap (). borrow ();
255
- let r = right . as_ref (). unwrap (). borrow ();
257
+ let l = a . as_ref (). unwrap (). borrow ();
258
+ let r = b . as_ref (). unwrap (). borrow ();
256
259
l . val == r . val && Self :: dfs (& l . left, & r . right) && Self :: dfs (& l . right, & r . left)
257
260
}
258
261
259
262
pub fn is_symmetric (root : Option <Rc <RefCell <TreeNode >>>) -> bool {
260
- if root . is_none () {
261
- return true ;
262
- }
263
- let node = root . as_ref (). unwrap (). borrow ();
264
- Self :: dfs (& node . left, & node . right)
263
+ Self :: dfs (& root , & root )
265
264
}
266
265
}
267
266
```
@@ -280,20 +279,17 @@ impl Solution {
280
279
*/
281
280
public class Solution {
282
281
public bool IsSymmetric (TreeNode root ) {
283
- if (root == null ) {
284
- return true ;
285
- }
286
- return dfs (root .left , root .right );
282
+ return dfs (root , root );
287
283
}
288
284
289
- public bool dfs (TreeNode left , TreeNode right ) {
290
- if (left == null && right == null ) {
285
+ private bool dfs (TreeNode a , TreeNode b ) {
286
+ if (a == null && b == null ) {
291
287
return true ;
292
288
}
293
- if (left == null || right == null || left .val != right .val ) {
289
+ if (a == null || b == null || a .val != b .val ) {
294
290
return false ;
295
291
}
296
- return dfs (left .left , right .right ) && dfs (left .right , right .left );
292
+ return dfs (a .left , b .right ) && dfs (a .right , b .left );
297
293
}
298
294
}
299
295
```
0 commit comments