1.题目
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入: 1 1
/ \ / \
2 3 2 3[1,2,3], [1,2,3]
输出: true
示例 2:
输入: 1 1
/ \
2 2[1,2], [1,null,2]
输出: false
示例 3:输入: 1 1
/ \ / \
2 1 1 2[1,2,1], [1,1,2]
输出: false
2.code
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if(q==NULL&&p==NULL)
return true;
else if((q!=NULL&&p==NULL)||(p!=NULL&&q==NULL))
return false;
else if(p->left==NULL&&p->right==NULL&&q->left==NULL&&q->right==NULL&&p->val==q->val)
return true;
else if(p->val==q->val)
return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
else
return false;
}
3.总结
题目思路比较简单,就是递归求解,分而治之。如果根节点相等,那么问题就变小一点:左子树是不是相等,右子树是不是相等。依次判断左右子树,但是递归需要处理初始值以及边界情况。
5个月之后重写这道题,思路很清晰,并且讨论的也不是很啰嗦了。
1.是不是都为空:都为空/其中一个为空/两个都不为空(进行下一步判断)
2.根节点是否相等:相等(递归)不想等(false)
有一个小tip:
solution.cpp: In member function isSameTree
Line 24: Char 5: error: control reaches end of non-void function [-Werror=return-type]
}
^
cc1plus: some warnings being treated as errors
做这道题的时候,爆出来这个bug,因为缺乏返回值。我当时以为是返回值类型的原因,最后发现是因为我都是if判断,如果都不满足我的判断,则没有返回值,所以就报错了,在结尾加一个返回值就可以。