跟小D每日学口语

发条柠檬

使人成熟的是经历,而不是岁月。
  博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

判断两棵树是否相等

Posted on 2011-12-04 17:15  发条柠檬  阅读(1390)  评论(0编辑  收藏  举报

题目:请实现两棵树是否相等的比较,相等返回1,否则返回其他值,并说明算法复杂度。

数据结构为:

typedef struct_TreeNode{
char c;
TreeNode *leftchild;
TreeNode *rightchild;
}TreeNode;

函数接口为:int CompTree(TreeNode* tree1,TreeNode* tree2);

注:A、B两棵树相等当且仅当Root->c==RootB–>c,而且A和B的左右子树相等或者左右互换相等。

 

如果是单纯比较树则这个问题比较简单,这个地方有一个左右互换相等,需要特别处理一下:

如下图,就是相同的树,左右互换相等。

仔细分析一下,如果用递归算法,可以很简单的得到一个解:

对于2个孩子的节点,A与B是否相等等同于

compare(A.left, B.left) && compare(A.right, B.right) || compare(A.left, B.right) && compare(A.right, B.left)

 

实现程序如下:

int CompTree(TreeNode* tree1,TreeNode* tree2)
{
if(tree1 == NULL && tree2 == NULL)
return 1;

if(tree1 != NULL && tree2 != NULL)
{
if(tree1->c == tree2->c)
{
if(CompTree(tree1->leftchild, tree2->leftchild) &&
CompTree(tree1->rightchild, tree2->rightchild) ||
CompTree(tree1->rightchild, tree2->leftchild) &&
CompTree(tree1->leftchild, tree2->rightchild))
{
return 1;
}
}
}

return 0;
}