这个题目非常好,是智力题,感兴趣就替你想想:
首先要搞清什么叫“相似”,这要定义好:
如果有两个树的左右子树也对应相类,称“相似”。那程序就好编了,象遍历一样,仍用“递归”。
算法:
1. 如果两个树,都是空,就是相似;
2. 如果两个树都不空,左子树与左子树也相似,右子树与右子树也相类,则这两树相似,
这里明显是递归了;
3. 否则,两树中肯定有一个为空,另一个不为空,这种情况不相类;
假设树类型TTree,有左子树Left,右子树RIght, 两树t1,t2 判定相似的子程序:
bool isLike(TTree: t1,TTree: t2)
{
if (t1==NULL && t2==NULL)
return(true); // 空树,相似
else
if (t1!=NULL && t2!=NULL)
{ // 有递归,下面拆开的目的,提高递归效率
if ( ! isLike(t1->Left,t2->Left))
return(false); // 左跟左不相似,则树不相似
if (! isLike(t1->Right,t2->Right))
return(false); // 右跟右不相似,则树不相似
return(true); // 排除了不相似的情况,就是相似的了
}
else
return(false); // 剩下的情况就是一个空,另一个不空,肯定不相似
}
main()
{
TTree tree;
//.................
if (tree==NULL)
; // 显示树为空
else
if (isLIke(tree->Left,tree->Right))
; // 显示“ 树左右子树相似”
else
; // 显示“树左右子树不相似
} |