1.描述
检查两棵二叉树是否等价。等价的意思是说,首先两棵二叉树必须拥有相同的结构,并且每个对应位置上的节点上的数都相等。
1 1
/ \ / \
2 2 and 2 2
/ /
4 4
就是两棵等价的二叉树。
1 1
/ \ / \
2 3 and 2 3
/ \
4 4
就不是等价的。
2.分析
该题和克隆二叉树有异曲同工之秒,两颗二叉树必须拥有相同的结构,并且对应位置上的节点值也相同。
先判断当前节点的值是否相同,之后按照相同的结构走下去判断后面的节点值是否也相同。
下面给出我两个AC代码,第一个代码在函数外定义了一个全局变量flag作为标志,第二个代码直接定义了
bool函数。相比之下,好像第二个高端大气一点O(∩_∩)O~
3.代码
(1)
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @aaram a, b, the root of binary trees.
* @return true if they are identical, or false.
*/
int flag=0;//flag作为标志,初始值为0,一旦有任何节点不相等,flag变为1
void panduan(TreeNode* a, TreeNode* b)
{
if(a==NULL)
{
if(b!=NULL)
flag=1;
return;
}
if(b==NULL)
{
if(a!=NULL)
flag=1;
return;
}
if(a->val!=b->val)
flag=1;
//cout<<flag<<endl;
panduan(a->left,b->left);
panduan(a->right,b->right);
}
bool isIdentical(TreeNode* a, TreeNode* b) {
// Write your code here
panduan(a,b);
if(flag==0) return 1;//若flag为0无变化,说明所有节点都有相同结构相同值
else return 0;//若flag为1,则有节点不同
}
};
(2)
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @aaram a, b, the root of binary trees.
* @return true if they are identical, or false.
*/
bool panduan(TreeNode* a, TreeNode* b)
{
if(a==NULL&&b==NULL)//若当前两个节点都为空,则当前两节点相同
return true;
if(a!=NULL&&b!=NULL&&a->val==b->val)
return panduan(a->left,b->left)&&panduan(a->right,b->right);//对下面的节点进行比较,都相同时return true
return false;
}
bool isIdentical(TreeNode* a, TreeNode* b) {
// Write your code here
return panduan(a,b);
}
};
4.总结
等价二叉树,只有当两棵树结构和对应位置的节点值都相同时才等价。因此当前节点值比较完后
两棵树的节点应该按照同样的结构遍历子树进而继续判断节点值。当两个节点都为空时虽然没有
节点值但他们也是相等的。