给你两棵二叉树的根节点
p
和q
,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入:p = [1,2,3], q = [1,2,3] 输出:true示例 2:
输入:p = [1,2], q = [1,null,2] 输出:false示例 3:
输入:p = [1,2,1], q = [1,1,2] 输出:false提示:
- 两棵树上的节点数目都在范围
[0, 100]
内-10^4 <= Node.val <= 10^4
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:
vector<int>p1;
vector<int>p2;
vector<int>q1;
vector<int>q2;
int same;
void preTraversal(TreeNode* root,int flag) {
if(flag==0){
if(!root)p2.push_back(-100005);
else {
p2.push_back(root->val);
preTraversal(root->left,flag);
preTraversal(root->right,flag);
}
} if(flag==1){
if(!root)q2.push_back(-100005);
else {
q2.push_back(root->val);
preTraversal(root->left,flag);
preTraversal(root->right,flag);
}
}
}
void inorderTraversal(TreeNode* root,int flag) {
if(flag==0){
if(!root)return;
else {
inorderTraversal(root->left,flag);
p1.push_back(root->val);
inorderTraversal(root->right,flag);
}
} if(flag==1){
if(!root)return;
else {
inorderTraversal(root->left,flag);
q1.push_back(root->val);
inorderTraversal(root->right,flag);
}
}
}
bool isSameTree(TreeNode* p, TreeNode* q) {
if(p==nullptr&&q!=nullptr)return false;
if(q==nullptr&&p!=nullptr)return false;
inorderTraversal(p,0);
preTraversal(q,1);
preTraversal(p,0);
inorderTraversal(q,1);
if(p1.size()!=q1.size())return false;
if(p2.size()!=q2.size())return false;
vector<int>::iterator iter1, iter2;
iter1 = p1.begin();
iter2 = q1.begin();
while (iter1 != p1.end() && iter2 != q1.end()) {
if(*iter1 != *iter2) {
same=1;
}
if(same==1)return false;
++iter1;
++iter2;
}
iter1 = p2.begin();
iter2 = q2.begin();
while (iter1 != p2.end() && iter2 != q2.end()) {
if(*iter1 != *iter2) {
same=1;
}
if(same==1)return false;
++iter1;
++iter2;
}
return true;
}
};
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:
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
if(p==NULL&&q==NULL) return true;
if(p==NULL||q==NULL) return false;
if(p->val!=q->val) return false;
return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}
};
来源:力扣(LeetCode)