方法一:
递归。(深度优先遍历思想)
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if(p==nullptr&&q==nullptr) return true; //p和q都为空指针,则为同一棵树
if(p==nullptr||q==nullptr) return false; //p和q其中一个为空,不为同一棵树
if(p->val!=q->val) return false; //p和q都不为空,但值不相同
return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}
};
方法二:
广度优先遍历思想。
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
queue<TreeNode*> tmpQueue;
tmpQueue.push(p);
tmpQueue.push(q);
while(!tmpQueue.empty())
{
auto q = tmpQueue.front();
auto p = tmpQueue.front();
tmpQueue.pop();
tmpQueue.pop();
if(q==nullptr&&p==nullptr)
continue;
if(q==nullptr||p==nullptr)
return false;
if(q->val!=p->val)
return false;
tmpQueue.push(p->left);
tmpQueue.push(q->left);
tmpQueue.push(p->right);
tmpQueue.push(q->right);
}
return true;
}
};
不知道为什么出现错误。待修正。
贴出官方版本:
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == nullptr && q == nullptr) {
return true;
} else if (p == nullptr || q == nullptr) {
return false;
}
queue <TreeNode*> queue1, queue2;
queue1.push(p);
queue2.push(q);
while (!queue1.empty() && !queue2.empty()) {
auto node1 = queue1.front();
queue1.pop();
auto node2 = queue2.front();
queue2.pop();
if (node1->val != node2->val) {
return false;
}
auto left1 = node1->left, right1 = node1->right, left2 = node2->left, right2 = node2->right;
if ((left1 == nullptr) ^ (left2 == nullptr)) {
return false;
}
if ((right1 == nullptr) ^ (right2 == nullptr)) {
return false;
}
if (left1 != nullptr) {
queue1.push(left1);
}
if (right1 != nullptr) {
queue1.push(right1);
}
if (left2 != nullptr) {
queue2.push(left2);
}
if (right2 != nullptr) {
queue2.push(right2);
}
}
return queue1.empty() && queue2.empty();
}
};