题目描述:
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
思路:
机智的我用了一个定理: 前序遍历和中续遍历 可以唯一确定一颗二叉树。
所以我就把他们的前序遍历结果用数组存了起来,判断是否相等。
再后序遍历数组也存起来,再判断是否相等。
但是这样做有一个问题,就是结点的值一样的情况下无法判断。但是通过增加了对空结点的输出解决了这个问题。
我是用-1表示空结点的,肯定是存在问题的。
看了一下测试用例的数量,只有57个(2019-08-08 00:12:16),大概数据太弱了吧。
另外还有一个问题,我不算是问题吧,用C数组写的,写死了空间,10000个,这个不好,一方面空间浪费,另一方面结点超过10000个就不行了。(当然,这可以用C++ vector解决,也可以用C解决)
官方题解
看了官方题解,不禁想要问自己,我是猪吗?
为什么要写这么复杂的代码呀,明明有更简单,性能更高的代码。
思路就是递归,一个一个结点判断。
比较简单,直接看代码就可以理解了。
/**
* Definition for a binary tree node.
* 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);
}
性能那是杠杠的呀!