【题目描述】
给你两棵二叉树的根节点 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
【思路分析】
两树相同,要求画出来的二叉树完全一样,即每个位置上的节点均相同。
我们先考虑极端情况,即两棵树均为空树,此时仍然认为两树相等,可以单独提出来做特殊处理。
其余的情况即非空树,而所有非空二叉树在遍历时候的一个共同点就是递归操作。(在上一篇博客中也提到过,二叉树的所有题目几乎都是在遍历的基础上进行操作的,而二叉树遍历最简单的方法就是递归)。所以要判断两棵树是否相同,实际上我们只需要考虑当前节点、左子树、右子树三个部分,而左右子树都是直接扔入递归,那么最后要考虑的就只有一个当前节点。两棵树的当前节点分别是p和q,只要其均不为空并且p->val和q->val相等,则可以断定p和q相等。(左右子树进行递归操作也是进行相同的判断)
总结一下,对于每次传入isSameTree函数的两棵树p和q,如果两棵树均为空,则直接返回true;否则需要判断其是否同时满足以下条件:①p和q均不为空;②p->val = q->val;③isSameTree(p->left, q->left)返回值为true;④isSameTree(p->right, q->right)返回值为true
【参考代码】
C实现
#include <stdio.h>
//easy-100-相同的树
bool isSameTree(struct TreeNode* p, struct TreeNode* q);
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
if(NULL==p && NULL==q){
return true;
}
return p!=NULL && q!=NULL && p->val == q->val && isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
C++实现
#include <iostream>
using namespace std;
//easy-100-相同的树
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);
};
bool Solution::isSameTree(TreeNode* p, TreeNode* q){
if(NULL==p && NULL==q){
return true;
}
return p!=NULL && q!=NULL && q->val==p->val && isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}