[英]Similar Binary Trees
我编写了以下函数来检查两个b树是否相似。 但是我没有得到想要的输出。
int bt_similar(btree *b1, btree *b2)
{
int m=1;
if ((b1->data==b2->data&&(((b1->lchild==NULL&&b2->lchild==NULL)||(b1->lchild!=NULL&&b2->lchild!=NULL))&&((b1->rchild==NULL&&b2->rchild==NULL)||(b1->rchild!=NULL&&b2->rchild!=NULL))))&&(m))
{
if (b1->lchild!=NULL)
m=bt_similar(b1->lchild,b2->lchild);
if (b1->rchild!=NULL)
m=bt_similar(b1->rchild,b2->rchild);
if (m)
return 1;
}
return 0;
}
首先,您可以从破坏代码中受益匪浅,特别是第四行的if
语句中的大条件令人讨厌 。 为什么不仅仅在方法本身中处理null情况? 例如:
if (b1 == null && b2 != null)
return 0;
if (b2 == null && b1 != null)
return 0;
if (b1 == null && b2 == null)
return 1;
据我所知,代码的实际问题是您在第9行覆盖了m的值,而没有考虑先前的值。 如果树的左侧不相似,而右侧相似,则返回值为1。
if (b1->lchild!=NULL)
m=bt_similar(b1->lchild,b2->lchild);
if (b1->rchild!=NULL)
m=bt_similar(b1->rchild,b2->rchild);
你应该有:
if (b1->lchild!=NULL)
m = bt_similar(b1->lchild,b2->lchild);
if (b1->rchild!=NULL)
m = m && bt_similar(b1->rchild,b2->rchild);
您应确保b1 == NULL或b2 == NULL ...
bool compare(struct node* b1, struct node* b2) {
// 1. both empty -> true
if (b1==NULL && b2==NULL) return(true);
// 2. both non-empty -> compare them
else if (b1!=NULL && b2!=NULL) {
return(
b1->data == b2->data &&
compare(b1->lchild, b2->lchild) &&
compare(b1->rchild, b2->rchild));
}
// 3. one empty, one not -> false
else return false;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.