/***********************************************************************
算法描述:若已知两棵二叉树B1和B2皆为空,或者皆不空且B1的左,右子树和B2的
左,右子树分别相似,则称二叉树B1和B2相似.试编写算法,判别给定的两棵二叉树
是否相似 .(习题6.36)
*************************************************************************/
int compare(bitree B1, bitree B2)
{
if(!B1 && !B2)
return 1;
else
if(B1 && B2 && compare(B1->lch, B2->lch) && compare(B1->rch, B2->rch))
return 1;
else
return 0;
}
/*********************************************************
算法总结:
1.首先要明确的是相似是结构相似,而不是结点的数据域相似,故不能通过遍历来比较数据
域来确定是否相似.
2.而关于结构上的相似一开始是无法立即判断出来的.还是要通过遍历,但是遍历注重的就
不是数据域方面.而是各个结点的压栈顺序以及结点个数方面.所以if里面有4个条件共同
支撑.
i)B1 && B2说明首先要B1,B2同时存在,否则肯定是不会相似的(结点个数都不相同了)
ii)compare(B1->lch, B2->lch) && compare(B1->rch, B2->rch)是2个递归.也就是通过
递归进行遍历.遍历是一个结点一个结点向下走的,所以如果遍历时的"过程"都是一样的,
那么结构肯定是一样的了.
由于一切递归都可以用非递归来实现,这道题也可以.只不过非递归要模拟递归函数的栈
的工作机制.代码量多些.在这里使用递归十分清晰明白,可读性也比较好.
如果有时间把非递归的算法写写:)
**************************************************************/