40
40
41
41
<!-- tabs:start -->
42
42
43
+ ** 方法一:DFS**
44
+
45
+ 我们先判断 ` A ` 或 ` B ` 是否为空,如果 ` A ` 或 ` B ` 为空,直接返回 ` false ` 。
46
+
47
+ 然后我们定义一个 ` dfs(A, B) ` 函数,用于判断从 ` A ` 的根节点开始,是否存在一棵子树和 ` B ` 的结构相同,如果存在,返回 ` true ` ,否则返回 ` false ` 。
48
+
49
+ 在 ` dfs ` 函数中,我们首先判断 ` B ` 是否为空,如果 ` B ` 为空,说明 ` A ` 的子树和 ` B ` 的结构相同,返回 ` true ` 。
50
+
51
+ 然后我们判断 ` A ` 是否为空,或者 ` A ` 和 ` B ` 的根节点值是否相同,如果 ` A ` 为空,或者 ` A ` 和 ` B ` 的根节点值不相同,说明 ` A ` 的子树和 ` B ` 的结构不同,返回 ` false ` 。
52
+
53
+ 最后我们返回 ` dfs(A.left, B.left) and dfs(A.right, B.right) ` ,即 ` A ` 的左子树和 ` B ` 的左子树是否相同,以及 ` A ` 的右子树和 ` B ` 的右子树是否相同。
54
+
55
+ 最后我们返回 ` dfs(A, B) or isSubStructure(A.left, B) or isSubStructure(A.right, B) ` ,即 ` A ` 的子树和 ` B ` 的结构是否相同,或者 ` A ` 的左子树和 ` B ` 的结构是否相同,或者 ` A ` 的右子树和 ` B ` 的结构是否相同。
56
+
57
+ 时间复杂度 $O(m \times n)$,空间复杂度 $O(\max(m, n))$。其中 $m$ 和 $n$ 分别为树 ` A ` 和 ` B ` 的节点数。
58
+
43
59
### ** Python3**
44
60
45
61
``` python
@@ -62,11 +78,9 @@ class Solution:
62
78
63
79
if A is None or B is None :
64
80
return False
65
- return (
66
- dfs(A, B)
67
- or self .isSubStructure(A.left, B)
68
- or self .isSubStructure(A.right, B)
69
- )
81
+ if dfs(A, B):
82
+ return True
83
+ return self .isSubStructure(A.left, B) or self .isSubStructure(A.right, B)
70
84
```
71
85
72
86
### ** Java**
@@ -101,29 +115,30 @@ class Solution {
101
115
}
102
116
```
103
117
104
- ### ** JavaScript **
118
+ ### ** C++ **
105
119
106
- ``` js
120
+ ``` cpp
107
121
/* *
108
122
* Definition for a binary tree node.
109
- * function TreeNode(val) {
110
- * this.val = val;
111
- * this.left = this.right = null;
112
- * }
113
- */
114
- /**
115
- * @param {TreeNode} A
116
- * @param {TreeNode} B
117
- * @return {boolean}
123
+ * struct TreeNode {
124
+ * int val;
125
+ * TreeNode *left;
126
+ * TreeNode *right;
127
+ * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
128
+ * };
118
129
*/
119
- var isSubStructure = function (A , B ) {
120
- function dfs (A , B ) {
121
- if (! B ) return true ;
122
- if (! A || A .val != B .val ) return false ;
123
- return dfs (A .left , B .left ) && dfs (A .right , B .right );
130
+ class Solution {
131
+ public:
132
+ bool isSubStructure(TreeNode* A, TreeNode* B) {
133
+ if (!A || !B) return 0;
134
+ return dfs(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B);
135
+ }
136
+
137
+ bool dfs(TreeNode* A, TreeNode* B) {
138
+ if (!B) return 1;
139
+ if (!A || A->val != B->val) return 0;
140
+ return dfs(A->left, B->left) && dfs(A->right, B->right);
124
141
}
125
- if (! A || ! B ) return false ;
126
- return dfs (A , B ) || isSubStructure (A .left , B ) || isSubStructure (A .right , B );
127
142
};
128
143
```
129
144
@@ -156,30 +171,35 @@ func isSubStructure(A *TreeNode, B *TreeNode) bool {
156
171
}
157
172
```
158
173
159
- ### ** C++ **
174
+ ### ** JavaScript **
160
175
161
- ``` cpp
176
+ ``` js
162
177
/**
163
178
* Definition for a binary tree node.
164
- * struct TreeNode {
165
- * int val;
166
- * TreeNode *left;
167
- * TreeNode *right;
168
- * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
169
- * };
179
+ * function TreeNode(val) {
180
+ * this.val = val;
181
+ * this.left = this.right = null;
182
+ * }
170
183
*/
171
- class Solution {
172
- public:
173
- bool isSubStructure(TreeNode* A, TreeNode* B) {
174
- if (!A || !B) return 0;
175
- return dfs(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B);
176
- }
177
-
178
- bool dfs(TreeNode* A, TreeNode* B) {
179
- if (!B) return 1;
180
- if (!A || A->val != B->val) return 0;
181
- return dfs(A->left, B->left) && dfs(A->right, B->right);
184
+ /**
185
+ * @param {TreeNode} A
186
+ * @param {TreeNode} B
187
+ * @return {boolean}
188
+ */
189
+ var isSubStructure = function (A , B ) {
190
+ if (! A || ! B ) {
191
+ return false ;
182
192
}
193
+ const dfs = (A , B ) => {
194
+ if (! B ) {
195
+ return true ;
196
+ }
197
+ if (! A || A .val !== B .val ) {
198
+ return false ;
199
+ }
200
+ return dfs (A .left , B .left ) && dfs (A .right , B .right );
201
+ };
202
+ return dfs (A , B ) || isSubStructure (A .left , B ) || isSubStructure (A .right , B );
183
203
};
184
204
```
185
205
@@ -201,21 +221,20 @@ public:
201
221
*/
202
222
203
223
function isSubStructure(A : TreeNode | null , B : TreeNode | null ): boolean {
204
- if (A == null || B == null ) {
224
+ if (! A || ! B ) {
205
225
return false ;
206
226
}
227
+ const dfs = (A : TreeNode | null , B : TreeNode | null ): boolean => {
228
+ if (! B ) {
229
+ return true ;
230
+ }
231
+ if (! A || A .val !== B .val ) {
232
+ return false ;
233
+ }
234
+ return dfs (A .left , B .left ) && dfs (A .right , B .right );
235
+ };
207
236
return dfs (A , B ) || isSubStructure (A .left , B ) || isSubStructure (A .right , B );
208
237
}
209
-
210
- function dfs(A : TreeNode | null , B : TreeNode | null ) {
211
- if (B == null ) {
212
- return true ;
213
- }
214
- if (A == null ) {
215
- return false ;
216
- }
217
- return A .val === B .val && dfs (A .left , B .left ) && dfs (A .right , B .right );
218
- }
219
238
```
220
239
221
240
### ** Rust**
0 commit comments