题目链接:
题目描述:
Give two binary trees,write a function to check
if they are equal or not .
Two binary trees are considered equal if they are
structurally identical and the nodes have the same
value.
题目解释:
给定两个二叉树,实现一个函数来判断这两个
二叉树是否相同。
这里“相同”的概念不仅仅是指节点的数值,还
包括二叉树的结构是否相同(左子树跟右子树)。
解题方案:
涉及到树的问题,很多都会利用到递归的思想,
在这里我们依然是使用递归的方式。
我们从树的根开始,递归的去判断左子树和右
子树是否相同。
首先我们确定递归出口:
1.如果两课树都遍历完毕,遍历完毕的条件是
p == null and q == null,中途并没有return false
那么就return true.
2.如果在遍历过程中出现p、q中有一个为null的
情况,就说明两个二叉树在结构上不同,假设
p为null,那么说明第一个二叉树比第二个二叉
树少一课q子树,return false。
3.p q 的节点值不同 return false.
这三个条件就是递归出口,判断完这三个条件
以后我们继续递归左子树和右子树就可以了。
return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
下面是AC的源码:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSameTree(struct TreeNode *p, struct TreeNode *q) {
if(p == NULL && q == NULL)
{
return true;
}
if(p == NULL || q == NULL)
{
return false;
}
if(p->val != q->val )
{
return false;
}
return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}
PS:我犯了个挺低级的错误。
这里要注意一个问题,在最开始我实现这个
时候,我构建测试用例(TreeNode节点):
TreeNode *p;
p->val = 32;
然后编译,报错。
实际上TreeNode *p 仅仅是一个声明,并不是
定义,还没有给(*p)结构体分配空间,所以才
会报错。
正确的定义结构体的一种方式为:
TreeNode *p = new TreeNode;
希望你们不要犯跟我同样的错误。