题目:
力扣-100.相同的树https://leetcode.cn/problems/same-tree/
给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
提示:
- 两棵树上的节点数目都在范围
[0, 100]
内 -104 <= Node.val <= 104
方法一: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) {
// 1 如果p q都为NULL 则相同
if(p == NULL && q == NULL){
return true;
}
// 2 如果p q其中一个为NULL,另一个不为NULL 则不同
if(p == NULL || q == NULL){
return false;
}
// 3 如果p q的值不同 则不同
if(p->val != q->val){
return false;
}
// 4 递归左右子树
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 == NULL && q == NULL){
return true;
}
if(p == NULL || q == NULL){
return false;
}
// BFS逐层判断
queue<TreeNode*> p_queue;
queue<TreeNode*> q_queue;
p_queue.push(p);
q_queue.push(q);
// 当两个queue都为空时 退出while循环
while(!p_queue.empty() || !q_queue.empty()){
int p_num = p_queue.size();
// 逐个判断节点值是否相同
while(p_num > 0){
TreeNode* p_cur = p_queue.front();
TreeNode* q_cur = q_queue.front();
p_queue.pop();
q_queue.pop();
// 节点值不同返回false
if(p_cur->val != q_cur->val){
return false;
}
// 添加左右子节点
// 1 如果都不为空 则添加
// 2 如果都为空 do nothing
// 3 其中一个为空 返回false
// ps 其实这种间接保持了每一层的节点数量都是相同的
// 所以一开始不用判断节点数量是否相等
if(p_cur->left != NULL && q_cur->left != NULL){
p_queue.push(p_cur->left);
q_queue.push(q_cur->left);
}else if(p_cur->left == NULL && q_cur->left == NULL){
// do nothing
}else{
return false;
}
if(p_cur->right != NULL && q_cur->right != NULL){
p_queue.push(p_cur->right);
q_queue.push(q_cur->right);
}else if(p_cur->right == NULL && q_cur->right == NULL){
// do nothing
}else{
return false;
}
// p_num减1
p_num -= 1;
}
}
return true;
}
};