100.相同的树
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入: 1 1
/ \ / \
2 3 2 3
[1,2,3], [1,2,3]
输出: true
示例 2:
输入: 1 1
/ \
2 2
[1,2], [1,null,2]
输出: false
示例 3:
输入: 1 1
/ \ / \
2 1 1 2
[1,2,1], [1,1,2]
输出: false
我提交的代码
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == nullptr && q == nullptr) {
return true;
}
if ((p == nullptr && q != nullptr) || (p != nullptr && q == nullptr)) {
return false;
}
if (p->val == q->val) {
return (isSameTree(p->left, q->left) && isSameTree(p->right, q->right));
}else{
return false;
}
}
};
我的思想
当然是判断每个结点是否一样,如果每个结点都一样的话那就是相同的树。所以要遍历树,我使用递归来深度优先遍历树
情况:
1.递归结束条件:当两棵树同时遍历结束——>结点同时为空
- 如果一个结点为空,一个结点不为空——两棵树肯定不一样的
- 结点值相等的时候,递归判断她们的左右结点又是否同时满足
我的代码优化
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == nullptr && q == nullptr) return true;
if (p == nullptr || q == nullptr) return false;
if (p->val == q->val) return (isSameTree(p->left, q->left) && isSameTree(p->right, q->right));
else return false;
}
};
噗,这还能叫优化?只是看起来简洁了一点而已啊。啧啧菜的离谱
if (p == nullptr || q == nullptr)
if ((p == nullptr && q != nullptr) || (p != nullptr && q == nullptr))
这两句是一个意思,虽然使用 || 运算时,同时为1也能使得if条件为真,但是由于顺序执行,就轮不到 || 来执行同时为1的情况。所以只要p、q有一个为真时,就能返回false。
官方题解
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == nullptr && q == nullptr) {
return true;
} else if (p == nullptr || q == nullptr) {
return false;
} else if (p->val != q->val) {
return false;
} else {
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
}
};
我和官方思想是一样的,当情况相互对立的时候,使用else if减少情况判断,提高运行效率
其他优秀题解
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == nullptr) return q == nullptr;
return q != nullptr && p->val == q->val && isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
};
这个题解好666啊,把成立条件全部写在return 语句里,但是我很好奇怎么做到的减少了内存消耗?求大佬解答
我学会了
-
树的问题都是树的遍历问题,树的遍历问题就会用到递归。
递归模板:
void traverse(Tree root){ traverse(root.left); traverse(root.right); }
-
在对立条件时候使用else if,别写一堆if降低了运行效率
-
在递归的时候,可以把成立的条件都写在return里使用&&运算,减少了if的判断
有不对的地方,可以改进的地方还望着大佬指出,谢谢呀!我真是太菜了