题目:
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

解法一(深度优先搜索):
如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。
如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
//如果p和q均为空,则两树一定相同
if (p == nullptr && q == nullptr) {
return true;
//若p和q一个为空一个不为空,则一定不同
} else if (p == nullptr || q == nullptr) {
return false;
//先判断根节点是否相同,若相同则再继续判断p和q的左子树和右子树节点是否相同
} else if (p->val != q->val) {
return false;
} else {
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
}
};
解法二(广度优先搜索):
同样首先判断两个二叉树是否为空,如果两个二叉树都不为空,则从两个二叉树的根节点开始广度优先搜索。使用两个栈存储两个树的数据,先判断根节点值是否相同,然后再判断左子树和右子树节点值是否相同,栈为空时判断完成,代码如下所示:
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
stack<TreeNode*> TreeNode1;
stack<TreeNode*> TreeNode2;
if(p==nullptr and q!=nullptr){
return false;
}
if(p!=nullptr and q==nullptr){
return false;
}
while((p!=nullptr and q!=nullptr) or (!TreeNode1.empty() and !TreeNode2.empty())){
if(p->val!=q->val){
return false;
}
if(p->right!=nullptr and q->right!=nullptr){
if(p->right->val!=q->right->val){
return false;
}
TreeNode1.push((p->right));
TreeNode2.push((q->right));
}
else if((p->right)!=nullptr and (q->right)==nullptr){
return false;
}
else if ((p->right)==nullptr and (q->right)!=nullptr){
return false;
}
if(p->left!=nullptr and q->left!=nullptr){
if(p->left->val!=q->left->val){
return false;
}
TreeNode1.push(p->left);
TreeNode2.push(q->left);
}
else if(p->left!=nullptr and q->left==nullptr){
return false;
}
else if(p->left==nullptr and q->left!=nullptr){
return false;
}
if(TreeNode1.empty() and TreeNode2.empty()){
break;
}
p = TreeNode1.top();
q = TreeNode2.top();
TreeNode1.pop();
TreeNode2.pop();
}
return true;
}
};
特别注意:queue为定义队列的关键词,stack为定义栈的关键词
std::queue <TreeNode*> queue1, queue2;为队列的定义
std::stack<TreeNode*> stack1, stack2;
5万+

被折叠的 条评论
为什么被折叠?



