Skip to content

Commit 167242a

Browse files
committed
feat: add solutions to lcof problem: No.28
1 parent 329f0cd commit 167242a

File tree

9 files changed

+157
-178
lines changed

9 files changed

+157
-178
lines changed

lcof/面试题28. 对称的二叉树/README.md

+93-97
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,19 @@
4242

4343
## 解法
4444

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+
4558
<!-- tabs:start -->
4659

4760
### **Python3**
@@ -57,18 +70,14 @@
5770

5871
class Solution:
5972
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:
6275
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:
6477
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)
6879

69-
if root is None:
70-
return True
71-
return is_symmetric(root.left, root.right)
80+
return dfs(root, root)
7281
```
7382

7483
### **Java**
@@ -85,40 +94,47 @@ class Solution:
8594
*/
8695
class Solution {
8796
public boolean isSymmetric(TreeNode root) {
88-
if (root == null) return true;
89-
return isSymmetric(root.left, root.right);
97+
return dfs(root, root);
9098
}
9199

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);
96108
}
97109
}
98110
```
99111

100-
### **JavaScript**
112+
### **C++**
101113

102-
```js
114+
```cpp
103115
/**
104116
* 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+
* };
113123
*/
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);
119137
}
120-
if (!root) return true;
121-
return dfs(root.left, root.right);
122138
};
123139
```
124140
@@ -134,55 +150,45 @@ var isSymmetric = function (root) {
134150
* }
135151
*/
136152
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)
151164
}
152165
```
153166

154-
### **C++**
167+
### **JavaScript**
155168

156-
```cpp
169+
```js
157170
/**
158171
* 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+
* }
165176
*/
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) {
171184
return true;
172185
}
173-
if (left == nullptr || right == nullptr || left->val != right->val) {
186+
if (!a || !b || a.val != b.val) {
174187
return false;
175188
}
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);
186192
};
187193
```
188194

@@ -204,19 +210,16 @@ public:
204210
*/
205211

206212
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) {
212215
return true;
213216
}
214-
if (left == null || right == null || left.val != right.val) {
217+
if (!a || !b || a.val != b.val) {
215218
return false;
216219
}
217-
return dfs(left.left, right.right) && dfs(left.right, right.left);
220+
return dfs(a.left, b.right) && dfs(a.right, b.left);
218221
};
219-
return dfs(root.left, root.right);
222+
return dfs(root, root);
220223
}
221224
```
222225

@@ -241,27 +244,23 @@ function isSymmetric(root: TreeNode | null): boolean {
241244
// }
242245
// }
243246
// }
244-
use std::rc::Rc;
245247
use std::cell::RefCell;
248+
use std::rc::Rc;
246249
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() {
249252
return true;
250253
}
251-
if left.is_none() || right.is_none() {
254+
if a.is_none() || b.is_none() {
252255
return false;
253256
}
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();
256259
l.val == r.val && Self::dfs(&l.left, &r.right) && Self::dfs(&l.right, &r.left)
257260
}
258261

259262
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)
265264
}
266265
}
267266
```
@@ -280,20 +279,17 @@ impl Solution {
280279
*/
281280
public class Solution {
282281
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);
287283
}
288284

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) {
291287
return true;
292288
}
293-
if (left == null || right == null || left.val != right.val) {
289+
if (a == null || b == null || a.val != b.val) {
294290
return false;
295291
}
296-
return dfs(left.left, right.right) && dfs(left.right, right.left);
292+
return dfs(a.left, b.right) && dfs(a.right, b.left);
297293
}
298294
}
299295
```

lcof/面试题28. 对称的二叉树/Solution.cpp

+11-17
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,16 @@
99
*/
1010
class Solution {
1111
public:
12-
bool isSymmetric(TreeNode* left, TreeNode* right) {
13-
// 均为空,则直接返回 true。有且仅有一个不为空,则返回 false
14-
if (left == nullptr && right == nullptr) {
15-
return true;
16-
}
17-
if (left == nullptr || right == nullptr || left->val != right->val) {
18-
return false;
19-
}
20-
return isSymmetric(left->left, right->right) && isSymmetric(left->right, right->left);
21-
}
22-
2312
bool isSymmetric(TreeNode* root) {
24-
if (root == nullptr) {
25-
return true;
26-
}
27-
28-
return isSymmetric(root->left, root->right);
13+
function<bool(TreeNode*, TreeNode*)> dfs = [&](TreeNode* a, TreeNode* b) -> bool {
14+
if (!a && !b) {
15+
return true;
16+
}
17+
if (!a || !b || a->val != b->val) {
18+
return false;
19+
}
20+
return dfs(a->left, b->right) && dfs(a->right, b->left);
21+
};
22+
return dfs(root, root);
2923
}
30-
};
24+
};

lcof/面试题28. 对称的二叉树/Solution.cs

+5-8
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,16 @@
99
*/
1010
public class Solution {
1111
public bool IsSymmetric(TreeNode root) {
12-
if (root == null) {
13-
return true;
14-
}
15-
return dfs(root.left, root.right);
12+
return dfs(root, root);
1613
}
1714

18-
public bool dfs(TreeNode left, TreeNode right) {
19-
if (left == null && right == null) {
15+
private bool dfs(TreeNode a, TreeNode b) {
16+
if (a == null && b == null) {
2017
return true;
2118
}
22-
if (left == null || right == null || left.val != right.val) {
19+
if (a == null || b == null || a.val != b.val) {
2320
return false;
2421
}
25-
return dfs(left.left, right.right) && dfs(left.right, right.left);
22+
return dfs(a.left, b.right) && dfs(a.right, b.left);
2623
}
2724
}

lcof/面试题28. 对称的二叉树/Solution.go

+12-15
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,16 @@
66
* Right *TreeNode
77
* }
88
*/
9-
func isSymmetric(root *TreeNode) bool {
10-
if root == nil {
11-
return true
12-
}
13-
return isSymme(root.Left, root.Right)
14-
}
15-
16-
func isSymme(left *TreeNode, right *TreeNode) bool {
17-
if left == nil && right == nil {
18-
return true
19-
}
20-
if left == nil || right == nil || left.Val != right.Val {
21-
return false
22-
}
23-
return isSymme(left.Left, right.Right) && isSymme(left.Right, right.Left)
9+
func isSymmetric(root *TreeNode) bool {
10+
var dfs func(a, b *TreeNode) bool
11+
dfs = func(a, b *TreeNode) bool {
12+
if a == nil && b == nil {
13+
return true
14+
}
15+
if a == nil || b == nil || a.Val != b.Val {
16+
return false
17+
}
18+
return dfs(a.Left, b.Right) && dfs(a.Right, b.Left)
19+
}
20+
return dfs(root, root)
2421
}

0 commit comments

Comments
 (0)