给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
输入:p = [1,2,3], q = [1,2,3]
输出:true
输入:p = [1,2], q = [1,null,2]
输出:false
输入:p = [1,2,1], q = [1,1,2]
输出:false
提示:
- 两棵树上的节点数目都在范围 [0, 100] 内
- -104 <= Node.val <= 104
方法1:收集先序遍历结果进行比较,超出内存限制
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void travel(TreeNode* p,vector<int> &res){
while(p!=nullptr){
res.push_back(p->val);
travel(p->left,res);
travel(p->right,res);
}
}
bool isSameTree(TreeNode* p, TreeNode* q) {
vector<int> a,b;
travel(p,a);
travel(q,b);
return equal(a.begin(),a.end(),b.begin(),b.end())?true:false;
}
};
方法2:递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
/*
思路:
整体使用递归的方式实现。 先序遍历,两个节点的值与位置均相同
首先,定义递归的结束条件。
检查两个节点是否均为空。
如果两方均为空,则为真;
如果一方为空,另一方不为空,则为false。
其次,检查两个节点的值是否相同,相同为真;
最后,对以该节点为根的两颗子树进行先序遍历。根左右,
如果两颗树当前节点的左孩子进行遍历均相同,
则结果取决于对当前节点的右孩子遍历。
否则,两颗树当前节点的左孩子已经不同了,这两棵树即为不相同
*/
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{
if(isSameTree(p->left,q->left)){
return isSameTree(p->right,q->right);
}
return false;
}
return false;
}
};