Skip to content

Commit 4c66626

Browse files
author
Longerhaha
authored
Merge pull request gzc426#19 from Longerhaha/Longerhaha-patch-6
101_(对称二叉树)Symmetric Tree
2 parents d34dd75 + 74c0c94 commit 4c66626

File tree

2 files changed

+103
-19
lines changed

2 files changed

+103
-19
lines changed

2018.12.04-leetcode101/101. 对称二叉树

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
## 101_(对称二叉树)Symmetric Tree
2+
## 1 问题描述、输入输出与样例
3+
### 1.1 问题描述
4+
给定一个二叉树,检查它是否是镜像对称的。
5+
### 1.2 输入与输出
6+
输入:
7+
* TreeNode* root:二叉树的根节点指针
8+
9+
输出:
10+
* bool:是否是对称二叉树
11+
12+
### 1.3 样例
13+
#### 1.3.1 样例1
14+
输入: 给定二叉树: [1,2,2,3,4,4,3] ,
15+
16+
1
17+
/ \
18+
2 2
19+
/ \ / \
20+
3 4 4 3
21+
输出: true
22+
23+
#### 1.3.2 样例2
24+
输入:给定二叉树: [1,2,2,null,3,null,3] ,
25+
26+
1
27+
/ \
28+
2 2
29+
\ \
30+
3 3
31+
输出: false<br>
32+
## 2 思路描述与代码
33+
### 2.1 思路描述(队列法)
34+
利用队列做判断
35+
```cpp
36+
根节点左右孩子入队;
37+
while( 队列非空 ){
38+
取出队列两个元素 tmp1, tmp2;
39+
//如果当前节点都是空节点,结束本次循环,即不需要检查后续节点
40+
if(tmp1 == null && tmp2 == null) continue;
41+
//如果不对称,则返回false
42+
if((tmp1 == nullptr && tmp2) || (tmp2 == nullptr && tmp1) || (tmp1->val != tmp2->val))
43+
return false;
44+
//剩下的可能情况就是左右非空且当前节点的值相等,即对称
45+
//然后对这两个节点的左右孩子节点对称入队,保持对称性
46+
//对称入队
47+
tmp1 左孩子入队;
48+
tmp2 右孩子入队;
49+
tmp1 右孩子入队;
50+
tmp2 左孩子入队;
51+
}
52+
return true;
53+
```
54+
55+
### 2.2 代码
56+
```cpp
57+
bool isSymmetric(TreeNode* root) {
58+
if(root == nullptr)
59+
return true;
60+
//使用队列做遍历,这是也可以使用堆栈
61+
queue<TreeNode*> q;
62+
//根节点就不用判断了,直接加入左右孩子节点
63+
q.push(root->left);
64+
q.push(root->right);
65+
while( !q.empty() ){
66+
//从队列弹出两个节点
67+
TreeNode* tmp1 = q.front();
68+
q.pop();
69+
TreeNode* tmp2 = q.front();
70+
q.pop();
71+
//如果都是根节点,则结束本次循环
72+
if(tmp1 == nullptr && tmp2 == nullptr)
73+
continue;
74+
//如果不对称,则返回false
75+
if((tmp1 == nullptr && tmp2) || (tmp2 == nullptr && tmp1) || (tmp1->val != tmp2->val))
76+
return false;
77+
//对称入队
78+
q.push(tmp1->left);
79+
q.push(tmp2->right);
80+
q.push(tmp1->right);
81+
q.push(tmp2->left);
82+
}
83+
//都是对称的,返回真
84+
return true;
85+
}
86+
87+
```
88+
## 3 思考与拓展
89+
### 3.1 思考
90+
本题,利用队列和堆栈做遍历都可以解决这个问题。
91+
#### 3.1.1 其他方法
92+
#### 3.1.1.1 递归法
93+
一棵对称的二叉树必然是左右孩子相等且左右孩子也都是一棵对称的二叉树,利用该思路做递归就行了,这里就不继续写代码了。
94+
#### 3.1.2 复杂度分析
95+
方法|空间复杂度|时间复杂度
96+
--- | --- | ---
97+
队列法|O(2^h),h是树的高度|O(n)
98+
递归法|O(n)|O(n)
99+
#### 3.1.3 难点分析
100+
1. 对称与非对称的判断
101+
102+
### 3.2 拓展
103+
如果让你判断是不是同构的呢?

0 commit comments

Comments
 (0)