递归
递归三部曲:
1、确定递归函数的参数和返回值
参数为两个树的根节点,返回值为两棵树是否相同
2、确定终止条件
结点为空的情况和不为空值不同的情况
3、确定单层递归逻辑
单层递归的逻辑就是处理左右结点均不为空,且数值相同的情况。
比较左节点的左孩子和右节点的左孩子,比较左节点的右孩子和右节点的右孩子,如果都相同则返回true
/**
* 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 compare(TreeNode* left,TreeNode* right){
//空结点情况
if(left == NULL && right != NULL){
return false;
}else if(right == NULL && left != NULL){
return false;
}else if(left == NULL && right == NULL){
return true;
}else if(left->val != right->val){
//数值不同的情况
return false;
}
//左右节点都不为空 且数值相同
bool outside = compare(left->left,right->left);
bool inside = compare(left->right,right->right);
bool result = outside && inside;
return result;
}
bool isSameTree(TreeNode* p, TreeNode* q) {
return compare(p,q);
}
};
迭代
同步加入队列,同步取出比较
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == NULL && q == NULL){
return true;
}
if (p == NULL || q == NULL){
return false;
}
//迭代
queue<TreeNode*> que;
//根节点入队
que.push(p);
que.push(q);
//遍历
while(!que.empty()){
TreeNode* cur1 = que.front();
que.pop();
TreeNode* cur2 = que.front();
que.pop();
//两节点都为空
if(cur1== NULL && cur2 == NULL){
continue;
}
//某一节点为空或者两节点不为空时数值不一样
if(!cur1 || !cur2 || cur1->val != cur2->val){
return false;
}
//将该结点的左右孩子结点加入
que.push(cur1->left);
que.push(cur2->left);
que.push(cur1->right);
que.push(cur2->right);
}
return true;
}
};