@Leetcode相同的树
许久不曾动笔,上来是一道基础的数据结构题,本题和在数据结构的初学的某些题有一些相像,请看题干:
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
题目意思十分简单明了,让我们来看看最容易想到的一种解法,请看代码:
/**
* 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(p==NULL&&q==NULL)
return true;
else if(p==NULL||q==NULL||p->val!=q->val)
return false;
else {
return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}
}
};
从代码阔以看出,判断两棵树的某结点是否完全相等的条件有4个,但是其中需要注意如下的不少细节问题。
第一,必须先要写返回正确的条件,即两个结点都为空,也就是空树的情况是需要最先判断的。
第二,在第二个判断中,三个||的位置不能写反,这是因为如果出现p和q中的一个为空则不能判断他们的val值,从而会报错,是一个执行错误,出现这种错误的coder们可以关注一下这个问题。
第三,在返回其左或者右儿子的时候要用&&,即短路运算的返回模式来判断返回左或者右儿子,如果用普通的运算模式是无法通过第53个样例的,因为在那个样例中判断左儿子即可得到最后的双NULL的结果,而使用短路运算之后则能保证只进行其中满足要求的一项。
另外,本题也可以在else if中判断后面的正常进入儿子结点,判断条件与上方代码的false的判断条件相反,但需注意一定使用且而不是或来并列判断。