注意,LeetCode上的树,都是先序建立。
参考:
https://support.leetcode-cn.com/hc/kb/article/1194353/
提交代码:
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
//while(p!=NULL&&q!=NULL)//为什么要用while呢
if(p==NULL&&q==NULL)
{
return true;
}
if(p!=NULL&&q!=NULL)
{
if(p->val==q->val)
{
bool l1=isSameTree(p->left,q->left);
bool l2=isSameTree(p->right,q->right);
return l1&&l2;
}
else
return false;
}
return false;
}
提交结果:
这个题的思路是:
判断两棵树当前结点的值是否相等:if(p->val==q->val)。
如果相等,就递归:isSameTree(p->left,q->left)和isSameTree(p->right,q->right)。
关键是注意这个返回值。我第一次做的时候直接:
while(p!=NULL&&q!=NULL)//注意这个while。我用了while,直接死循环了。为什么我要用while呢……大概是做链表的后遗症。
{
if(p->val==q->val)
{
isSameTree(p->left,q->left);
isSameTree(p->right,q->right);
}
else
{
return false;
}
}
也没有:
if(p==NULL&&q==NULL)
{
return true;
}
后来在调试的时候就发现有问题。比如两棵树都是:
在执行完
isSameTree(B->left,C->left);
isSameTree(B->right,C->right);
的时候。就陷入了死循环。
注意上面程序中,我用到了while。直接死循环了。为什么我要用while呢……大概是做链表的后遗症。
递归的时候,执行到底层,应该得有个返回值。
if(p==NULL&&q==NULL)
{
return true;
}
……
return false;
还有:
bool l1=isSameTree(p->left,q->left);
bool l2=isSameTree(p->right,q->right);
return l1&&l2;
的另一个写法是:
return isSameTree(p->left,q->left)&&bool l2=isSameTree(p->right,q->right);