这种一般有递归和迭代两种解法,先上递归因为之前对有返回值的递归一直捋不清思路。
第一次毫无疑问失败
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p->left==nullptr&&p->right==nullptr&&q->right==nullptr&&q->right==nullptr)
return true;
if((p->left==nullptr&&q->left!=nullptr)||(p->right!=nullptr&&q->right==nullptr))
return false;
if(p->val==q->val)
return true;
return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}
};
问题很多,首先第一个终止条件有问题,不应该是判断该结点的左右节点,到达终止条件时,应该已经到nullptr叶子节点了。
然后第二个判定也有问题,太啰嗦。第三个递归进行的不对,我写的这个根本没有递归,应该是判定相同后递归,判定不同后返回false。
又修改了两次后,得到下面的:
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == q)//叶子结点,所以都是nullptr时相等
return true;
else if (p == nullptr || q == nullptr)//前面已经排除两个都是null
return false;
else//不含有nullptr也就是都有值val时,要么进入递归,要么false
{
if (p->val == q->val)
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
//直接在return中使用&&好点,这样第一个false就不会调用第二个了
else
return false;
}
}
};