@@ -62,18 +62,16 @@ B 是 A 的子结构, 即 A 中有出现和 B 相同的结构和节点值。
62
62
63
63
class Solution :
64
64
def isSubStructure (self , A : TreeNode, B : TreeNode) -> bool :
65
- def sub (A , B ):
66
- """ 判断从当前A节点开始,是否包含B"""
65
+ def dfs (A , B ):
67
66
if B is None :
68
67
return True
69
- if A is None :
68
+ if A is None or A.val != B.val :
70
69
return False
71
- return A.val == B.val and sub(A.left, B.left) and sub(A.right, B.right)
72
- if B is None or A is None :
70
+ return dfs(A.left, B.left) and dfs(A.right, B.right)
71
+
72
+ if A is None or B is None :
73
73
return False
74
- if A.val != B.val:
75
- return self .isSubStructure(A.left, B) or self .isSubStructure(A.right, B)
76
- return sub(A, B) or self .isSubStructure(A.left, B) or self .isSubStructure(A.right, B)
74
+ return dfs(A, B) or self .isSubStructure(A.left, B) or self .isSubStructure(A.right, B)
77
75
```
78
76
79
77
### ** Java**
@@ -90,16 +88,20 @@ class Solution:
90
88
*/
91
89
class Solution {
92
90
public boolean isSubStructure (TreeNode A , TreeNode B ) {
93
- if (B == null || A == null ) return false ;
94
- if (A . val != B . val) return isSubStructure(A . left, B ) || isSubStructure(A . right, B );
95
- return sub(A , B ) || isSubStructure(A . left, B ) || isSubStructure(A . right, B );
91
+ if (A == null || B == null ) {
92
+ return false ;
93
+ }
94
+ return dfs(A , B ) || isSubStructure(A . left, B ) || isSubStructure(A . right, B );
96
95
}
97
96
98
- private boolean sub (TreeNode A , TreeNode B ) {
99
- // 判断从当前A节点开始,是否包含B
100
- if (B == null ) return true ;
101
- if (A == null ) return false ;
102
- return A . val == B . val && sub(A . left, B . left) && sub(A . right, B . right);
97
+ private boolean dfs (TreeNode A , TreeNode B ) {
98
+ if (B == null ) {
99
+ return true ;
100
+ }
101
+ if (A == null || A . val != B . val) {
102
+ return false ;
103
+ }
104
+ return dfs(A . left, B . left) && dfs(A . right, B . right);
103
105
}
104
106
}
105
107
```
@@ -119,16 +121,14 @@ class Solution {
119
121
* @param {TreeNode} B
120
122
* @return {boolean}
121
123
*/
122
- var isSubStructure = function (A , B ) {
123
- function sub (A , B ) {
124
+ var isSubStructure = function (A , B ) {
125
+ function dfs (A , B ) {
124
126
if (! B ) return true ;
125
- if (! A ) return false ;
126
- return A . val == B . val && sub (A .left , B .left ) && sub (A .right , B .right );
127
+ if (! A || A . val != B . val ) return false ;
128
+ return dfs (A .left , B .left ) && dfs (A .right , B .right );
127
129
}
128
- if (! B || ! A ) return false ;
129
- if (A .val != B .val )
130
- return isSubStructure (A .left , B ) || isSubStructure (A .right , B );
131
- return sub (A , B ) || isSubStructure (A .left , B ) || isSubStructure (A .right , B );
130
+ if (! A || ! B ) return false ;
131
+ return dfs (A , B ) || isSubStructure (A .left , B ) || isSubStructure (A .right , B );
132
132
};
133
133
```
134
134
@@ -144,66 +144,46 @@ var isSubStructure = function (A, B) {
144
144
* }
145
145
*/
146
146
func isSubStructure (A *TreeNode , B *TreeNode ) bool {
147
- // 约定空树不是任意一个树的子结构
148
- if A == nil || B == nil {
149
- return false
150
- }
151
- return helper (A,B) || isSubStructure (A.Left ,B) || isSubStructure (A.Right ,B)
152
- }
153
-
154
- func helper (a *TreeNode , b *TreeNode ) bool {
155
- if b == nil {
156
- return true
157
- }
158
- if a == nil {
159
- return false
160
- }
161
- return a.Val == b.Val && helper (a.Left , b.Left ) && helper (a.Right , b.Right )
147
+ var dfs func (A, B *TreeNode) bool
148
+ dfs = func (A, B *TreeNode) bool {
149
+ if B == nil {
150
+ return true
151
+ }
152
+ if A == nil || A.Val != B.Val {
153
+ return false
154
+ }
155
+ return dfs (A.Left , B.Left ) && dfs (A.Right , B.Right )
156
+ }
157
+ if A == nil || B == nil {
158
+ return false
159
+ }
160
+ return dfs (A, B) || isSubStructure (A.Left , B) || isSubStructure (A.Right , B)
162
161
}
163
162
```
164
163
165
164
### ** C++**
166
165
167
166
``` cpp
167
+ /* *
168
+ * Definition for a binary tree node.
169
+ * struct TreeNode {
170
+ * int val;
171
+ * TreeNode *left;
172
+ * TreeNode *right;
173
+ * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
174
+ * };
175
+ */
168
176
class Solution {
169
177
public:
170
- bool isSubTree(TreeNode* a, TreeNode* b) {
171
- if (nullptr == b) {
172
- // 如果小树走到头,则表示ok了
173
- return true;
174
- }
175
-
176
- if (nullptr == a) {
177
- // 如果大树走到头,小树却没走到头,说明不对了
178
- return false;
179
- }
180
-
181
- if (a->val != b->val) {
182
- return false;
183
- }
184
-
185
- return isSubTree(a->left, b->left) && isSubTree(a->right, b->right);
178
+ bool isSubStructure(TreeNode* A, TreeNode* B) {
179
+ if (!A || !B) return 0;
180
+ return dfs(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B);
186
181
}
187
182
188
- bool isSubStructure(TreeNode* a, TreeNode* b) {
189
- bool ret = false;
190
- if (nullptr != a && nullptr != b) {
191
- // 题目约定,空树不属于任何一个数的子树
192
- if (a->val == b->val) {
193
- // 如果值相等,才进入判定
194
- ret = isSubTree(a, b);
195
- }
196
-
197
- if (false == ret) {
198
- ret = isSubStructure(a->left, b);
199
- }
200
-
201
- if (false == ret) {
202
- ret = isSubStructure(a->right, b);
203
- }
204
- }
205
-
206
- return ret;
183
+ bool dfs(TreeNode* A, TreeNode* B) {
184
+ if (!B) return 1;
185
+ if (!A || A->val != B->val) return 0;
186
+ return dfs(A->left, B->left) && dfs(A->right, B->right);
207
187
}
208
188
};
209
189
```
0 commit comments