100. 相同的树
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
思路
DFS
递归判断当前节点以及左右子树
代码
/**
* 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(TreeNode* p, TreeNode* q) {
if(p == nullptr && q == nullptr) {
return true;
}
if(p == nullptr || q == nullptr) {
return false;
}
if(p -> val != q -> val) {
return false;
}
return isSameTree(p -> left, q -> left) && isSameTree(p -> right, q -> right);
}
};
BFS
代码
/**
* 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(TreeNode* p, TreeNode* q) {
if(p == nullptr && q == nullptr) {
return true;
}
if(p == nullptr || q == nullptr) {
return false;
}
queue<TreeNode*> p1;
queue<TreeNode*> q1;
p1.push(p);
q1.push(q);
while(!p1.empty() && !q1.empty()) {
TreeNode* tmp1 = p1.front();
p1.pop();
TreeNode* tmp2 = q1.front();
q1.pop();
if(tmp1 -> val != tmp2 -> val) {
return false;
}
TreeNode* p_left = tmp1 -> left;
TreeNode* p_right = tmp1 -> right;
TreeNode* q_left = tmp2 -> left;
TreeNode* q_right = tmp2 -> right;
if((p_left == nullptr) ^ (q_left == nullptr)) {
return false;
}
if((p_right == nullptr) ^ (q_right == nullptr)) {
return false;
}
if(p_left != nullptr) {
p1.push(p_left);
}
if(p_right != nullptr) {
p1.push(p_right);
}
if(q_left != nullptr) {
q1.push(q_left);
}
if(q_right != nullptr) {
q1.push(q_right);
}
}
return p1.empty() && q1.empty();
}
};