Skip to content

Commit f0a92ad

Browse files
committed
feat: add solutions to lc problem: No.0101
No.0101.Symmetric Tree
1 parent 7ebbddf commit f0a92ad

File tree

9 files changed

+121
-25
lines changed

9 files changed

+121
-25
lines changed

solution/0100-0199/0100.Same Tree/README.md

+13-1
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,20 @@
4848

4949
**方法一:DFS**
5050

51+
我们可以使用 DFS 递归的方法来解决这个问题。
52+
53+
首先判断两个二叉树的根节点是否相同,如果两个根节点都为空,则两个二叉树相同,如果两个根节点中有且只有一个为空,则两个二叉树一定不同。如果两个根节点都不为空,则判断它们的值是否相同,如果不相同则两个二叉树一定不同,如果相同,则分别判断两个二叉树的左子树是否相同以及右子树是否相同。当以上所有条件都满足时,两个二叉树才相同。
54+
55+
时间复杂度 $O(\min(m, n))$,空间复杂度 $O(\min(m, n))$。其中 $m$ 和 $n$ 分别是两个二叉树的节点个数。空间复杂度主要取决于递归调用的层数,递归调用的层数不会超过较小的二叉树的节点个数。
56+
5157
**方法二:BFS**
5258

59+
我们也可以使用 BFS 迭代的方法来解决这个问题。
60+
61+
首先将两个二叉树的根节点分别加入两个队列。每次从两个队列各取出一个节点,进行如下比较操作。如果两个节点的值不相同,则两个二叉树的结构一定不同,如果两个节点的值相同,则判断两个节点的子节点是否为空,如果只有一个节点的左子节点为空,则两个二叉树的结构一定不同,如果只有一个节点的右子节点为空,则两个二叉树的结构一定不同,如果左右子节点的结构相同,则将两个节点的左子节点和右子节点分别加入两个队列,对于下一次迭代,将从两个队列各取出一个节点进行比较。当两个队列同时为空时,说明我们已经比较完了所有节点,两个二叉树的结构完全相同。
62+
63+
时间复杂度 $O(\min(m, n))$,空间复杂度 $O(\min(m, n))$。其中 $m$ 和 $n$ 分别是两个二叉树的节点个数。空间复杂度主要取决于队列中的元素个数,队列中的元素个数不会超过较小的二叉树的节点个数。
64+
5365
<!-- tabs:start -->
5466

5567
### **Python3**
@@ -66,7 +78,7 @@ DFS:
6678
# self.left = left
6779
# self.right = right
6880
class Solution:
69-
def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
81+
def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
7082
if p == q:
7183
return True
7284
if p is None or q is None or p.val != q.val:

solution/0100-0199/0100.Same Tree/README_EN.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ DFS or BFS.
5454
# self.left = left
5555
# self.right = right
5656
class Solution:
57-
def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
57+
def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
5858
if p == q:
5959
return True
6060
if p is None or q is None or p.val != q.val:

solution/0100-0199/0100.Same Tree/Solution.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# self.left = left
66
# self.right = right
77
class Solution:
8-
def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
8+
def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
99
if p == q:
1010
return True
1111
if p is None or q is None or p.val != q.val:

solution/0100-0199/0101.Symmetric Tree/README.md

+44-7
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,18 @@
4141

4242
<!-- 这里可写通用的实现逻辑 -->
4343

44+
**方法一:递归**
45+
46+
我们设计一个函数 $dfs(root1, root2)$,用于判断两个二叉树是否对称。答案即为 $dfs(root, root)$。
47+
48+
函数 $dfs(root1, root2)$ 的逻辑如下:
49+
50+
- 如果 $root1$ 和 $root2$ 都为空,则两个二叉树对称,返回 `true`
51+
- 如果 $root1$ 和 $root2$ 中只有一个为空,或者 $root1.val \neq root2.val$,则两个二叉树不对称,返回 `false`
52+
- 否则,判断 $root1$ 的左子树和 $root2$ 的右子树是否对称,以及 $root1$ 的右子树和 $root2$ 的左子树是否对称,这里使用了递归。
53+
54+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉树的节点数。
55+
4456
<!-- tabs:start -->
4557

4658
### **Python3**
@@ -55,7 +67,7 @@
5567
# self.left = left
5668
# self.right = right
5769
class Solution:
58-
def isSymmetric(self, root: TreeNode) -> bool:
70+
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
5971
def dfs(root1, root2):
6072
if root1 is None and root2 is None:
6173
return True
@@ -120,17 +132,42 @@ class Solution {
120132
class Solution {
121133
public:
122134
bool isSymmetric(TreeNode* root) {
135+
function<bool(TreeNode*, TreeNode*)> dfs = [&](TreeNode* root1, TreeNode* root2) -> bool {
136+
if (!root1 && !root2) return true;
137+
if (!root1 || !root2 || root1->val != root2->val) return false;
138+
return dfs(root1->left, root2->right) && dfs(root1->right, root2->left);
139+
};
123140
return dfs(root, root);
124141
}
125-
126-
bool dfs(TreeNode* root1, TreeNode* root2) {
127-
if (!root1 && !root2) return 1;
128-
if (!root1 || !root2 || root1->val != root2->val) return 0;
129-
return dfs(root1->left, root2->right) && dfs(root1->right, root2->left);
130-
}
131142
};
132143
```
133144
145+
### **Go**
146+
147+
```go
148+
/**
149+
* Definition for a binary tree node.
150+
* type TreeNode struct {
151+
* Val int
152+
* Left *TreeNode
153+
* Right *TreeNode
154+
* }
155+
*/
156+
func isSymmetric(root *TreeNode) bool {
157+
var dfs func(*TreeNode, *TreeNode) bool
158+
dfs = func(root1, root2 *TreeNode) bool {
159+
if root1 == nil && root2 == nil {
160+
return true
161+
}
162+
if root1 == nil || root2 == nil || root1.Val != root2.Val {
163+
return false
164+
}
165+
return dfs(root1.Left, root2.Right) && dfs(root1.Right, root2.Left)
166+
}
167+
return dfs(root, root)
168+
}
169+
```
170+
134171
### **TypeScript**
135172

136173
```ts

solution/0100-0199/0101.Symmetric Tree/README_EN.md

+32-7
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
# self.left = left
4747
# self.right = right
4848
class Solution:
49-
def isSymmetric(self, root: TreeNode) -> bool:
49+
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
5050
def dfs(root1, root2):
5151
if root1 is None and root2 is None:
5252
return True
@@ -109,17 +109,42 @@ class Solution {
109109
class Solution {
110110
public:
111111
bool isSymmetric(TreeNode* root) {
112+
function<bool(TreeNode*, TreeNode*)> dfs = [&](TreeNode* root1, TreeNode* root2) -> bool {
113+
if (!root1 && !root2) return true;
114+
if (!root1 || !root2 || root1->val != root2->val) return false;
115+
return dfs(root1->left, root2->right) && dfs(root1->right, root2->left);
116+
};
112117
return dfs(root, root);
113118
}
114-
115-
bool dfs(TreeNode* root1, TreeNode* root2) {
116-
if (!root1 && !root2) return 1;
117-
if (!root1 || !root2 || root1->val != root2->val) return 0;
118-
return dfs(root1->left, root2->right) && dfs(root1->right, root2->left);
119-
}
120119
};
121120
```
122121
122+
### **Go**
123+
124+
```go
125+
/**
126+
* Definition for a binary tree node.
127+
* type TreeNode struct {
128+
* Val int
129+
* Left *TreeNode
130+
* Right *TreeNode
131+
* }
132+
*/
133+
func isSymmetric(root *TreeNode) bool {
134+
var dfs func(*TreeNode, *TreeNode) bool
135+
dfs = func(root1, root2 *TreeNode) bool {
136+
if root1 == nil && root2 == nil {
137+
return true
138+
}
139+
if root1 == nil || root2 == nil || root1.Val != root2.Val {
140+
return false
141+
}
142+
return dfs(root1.Left, root2.Right) && dfs(root1.Right, root2.Left)
143+
}
144+
return dfs(root, root)
145+
}
146+
```
147+
123148
### **TypeScript**
124149

125150
```ts

solution/0100-0199/0101.Symmetric Tree/Solution.cpp

+5-6
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,11 @@
1212
class Solution {
1313
public:
1414
bool isSymmetric(TreeNode* root) {
15+
function<bool(TreeNode*, TreeNode*)> dfs = [&](TreeNode* root1, TreeNode* root2) -> bool {
16+
if (!root1 && !root2) return true;
17+
if (!root1 || !root2 || root1->val != root2->val) return false;
18+
return dfs(root1->left, root2->right) && dfs(root1->right, root2->left);
19+
};
1520
return dfs(root, root);
1621
}
17-
18-
bool dfs(TreeNode* root1, TreeNode* root2) {
19-
if (!root1 && !root2) return 1;
20-
if (!root1 || !root2 || root1->val != root2->val) return 0;
21-
return dfs(root1->left, root2->right) && dfs(root1->right, root2->left);
22-
}
2322
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* type TreeNode struct {
4+
* Val int
5+
* Left *TreeNode
6+
* Right *TreeNode
7+
* }
8+
*/
9+
func isSymmetric(root *TreeNode) bool {
10+
var dfs func(*TreeNode, *TreeNode) bool
11+
dfs = func(root1, root2 *TreeNode) bool {
12+
if root1 == nil && root2 == nil {
13+
return true
14+
}
15+
if root1 == nil || root2 == nil || root1.Val != root2.Val {
16+
return false
17+
}
18+
return dfs(root1.Left, root2.Right) && dfs(root1.Right, root2.Left)
19+
}
20+
return dfs(root, root)
21+
}

solution/0100-0199/0101.Symmetric Tree/Solution.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# self.left = left
66
# self.right = right
77
class Solution:
8-
def isSymmetric(self, root: TreeNode) -> bool:
8+
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
99
def dfs(root1, root2):
1010
if root1 is None and root2 is None:
1111
return True

solution/2000-2099/2071.Maximum Number of Tasks You Can Assign/Solution.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
class Solution:
2-
def maxTaskAssign(self, tasks: List[int], workers: List[int], pills: int, strength: int) -> int:
2+
def maxTaskAssign(
3+
self, tasks: List[int], workers: List[int], pills: int, strength: int
4+
) -> int:
35
def check(x):
46
i = 0
57
q = deque()

0 commit comments

Comments
 (0)