Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita86f06e

Browse files
Update
1 parentb872cf6 commita86f06e

10 files changed

+546
-69
lines changed

‎README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@
284284
|[0486.预测赢家](https://github.com/youngyangyang04/leetcode/blob/master/problems/0486.预测赢家.md)|动态规划|中等|**递归****记忆递归****动态规划**|
285285
|[0491.递增子序列](https://github.com/youngyangyang04/leetcode/blob/master/problems/0491.递增子序列.md)|深度优先搜索|中等|**深度优先搜索/回溯算法**|
286286
|[0501.二叉搜索树中的众数](https://github.com/youngyangyang04/leetcode/blob/master/problems/0501.二叉搜索树中的众数.md)|二叉树|简单|**递归/中序遍历**|
287+
|[0513.找树左下角的值](https://github.com/youngyangyang04/leetcode/blob/master/problems/0513.找树左下角的值.md)|二叉树|中等|**递归****迭代**|
287288
|[0515.在每个树行中找最大值](https://github.com/youngyangyang04/leetcode/blob/master/problems/0515.在每个树行中找最大值.md)|二叉树|简单|**广度优先搜索/队列**|
288289
|[0538.把二叉搜索树转换为累加树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0538.把二叉搜索树转换为累加树.md)|二叉树|简单|**递归****迭代**|
289290
|[0541.反转字符串II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0541.反转字符串II.md)|字符串|简单|**模拟**|

‎pics/100.相同的树.png

58.4 KB
Loading

‎pics/110.平衡二叉树2.png

163 KB
Loading

‎pics/257.二叉树的所有路径.png

32.3 KB
Loading
29.3 KB
Loading

‎problems/0100.相同的树.md

Lines changed: 108 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,115 @@
11
##题目地址
22
https://leetcode-cn.com/problems/same-tree/
33

4-
##思路
4+
(没写完)
55

6-
这道题目和101 基本是一样的
6+
#100. 相同的树
7+
8+
给定两个二叉树,编写一个函数来检验它们是否相同。
9+
10+
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
11+
12+
<imgsrc='../pics/100.相同的树.png'width=600> </img></div>
13+
14+
#思路
15+
16+
[二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)中,我们讲到对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了**其实我们要比较的是两个树(这两个树是根节点的左右子树)**,所以在递归遍历的过程中,也是要同时遍历两棵树。
17+
18+
理解这一本质之后,就会发现,求二叉树是否对称,和求二叉树是否相同几乎是同一道题目。
19+
20+
**如果没有读过[二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)这一篇,请认真读完再做这道题,就会有感觉了。**
21+
22+
递归三部曲中:
23+
24+
1. 确定递归函数的参数和返回值
25+
26+
我们要比较的是两个树是否是相互相同的,参数也就是两个树的根节点。
27+
28+
返回值自然是bool类型。
29+
30+
代码如下:
31+
```
32+
bool compare(TreeNode* tree1, TreeNode* tree2)
33+
```
34+
35+
分析过程同[二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)
36+
37+
2. 确定终止条件
38+
39+
**要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了。**
40+
41+
节点为空的情况有:
42+
43+
* tree1为空,tree2不为空,不对称,return false
44+
* tree1不为空,tree2为空,不对称 return false
45+
* tree1,tree2都为空,对称,返回true
46+
47+
此时已经排除掉了节点为空的情况,那么剩下的就是tree1和tree2不为空的时候:
48+
49+
* tree1、tree2都不为空,比较节点数值,不相同就return false
50+
51+
此时tree1、tree2节点不为空,且数值也不相同的情况我们也处理了。
52+
53+
代码如下:
54+
```
55+
if (tree1 == NULL && tree2 != NULL) return false;
56+
else if (tree1 != NULL && tree2 == NULL) return false;
57+
else if (tree1 == NULL && tree2 == NULL) return true;
58+
else if (tree1->val != tree2->val) return false; // 注意这里我没有使用else
59+
```
60+
61+
分析过程同[二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)
62+
63+
3. 确定单层递归的逻辑
64+
65+
* 比较二叉树是否相同 :传入的是tree1的左孩子,tree2的右孩子。
66+
* 如果左右都相同就返回true ,有一侧不相同就返回false 。
67+
68+
代码如下:
69+
70+
```
71+
bool outside = compare(tree1->left, tree2->right); // 左子树:左、 右子树:左
72+
bool inside = compare(tree1->right, tree2->left); // 左子树:右、 右子树:右
73+
bool isSame = outside && inside; // 左子树:中、 右子树:中(逻辑处理)
74+
return isSame;
75+
```
76+
-------------------------------------------------------------- 写到这
77+
最后递归的C++整体代码如下:
78+
79+
```
80+
class Solution {
81+
public:
82+
bool compare(TreeNode* left, TreeNode* right) {
83+
// 首先排除空节点的情况
84+
if (left == NULL && right != NULL) return false;
85+
else if (left != NULL && right == NULL) return false;
86+
else if (left == NULL && right == NULL) return true;
87+
// 排除了空节点,再排除数值不相同的情况
88+
else if (left->val != right->val) return false;
89+
90+
// 此时就是:左右节点都不为空,且数值相同的情况
91+
// 此时才做递归,做下一层的判断
92+
bool outside = compare(left->left, right->right); // 左子树:左、 右子树:右
93+
bool inside = compare(left->right, right->left); // 左子树:右、 右子树:左
94+
bool isSame = outside && inside; // 左子树:中、 右子树:中 (逻辑处理)
95+
return isSame;
96+
97+
}
98+
bool isSymmetric(TreeNode* root) {
99+
if (root == NULL) return true;
100+
return compare(root->left, root->right);
101+
}
102+
};
103+
```
104+
105+
**我给出的代码并不简洁,但是把每一步判断的逻辑都清楚的描绘出来了。**
106+
107+
如果上来就看网上各种简洁的代码,看起来真的很简单,但是很多逻辑都掩盖掉了,而题解可能也没有把掩盖掉的逻辑说清楚。
108+
109+
**盲目的照着抄,结果就是:发现这是一道“简单题”,稀里糊涂的就过了,但是真正的每一步判断逻辑未必想到清楚。**
110+
111+
当然我可以把如上代码整理如下:
112+
这道题目本质上和[二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)是一样,因为
7113

8114
##递归
9115

@@ -42,7 +148,6 @@ public:
42148
if (!leftNode && !rightNode) { //
43149
continue;
44150
}
45-
46151
//
47152
if ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) {
48153
return false;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp