如何看待2个二叉树是否相似?

时间:2012-01-19 07:39:10

标签: c binary-tree

我需要检查两个二叉树以查看它们是否相似...意味着它们是否具有完全相同的结构,然后是相同级别的数据(但数据不需要在相同的结构中) ...

实施例

     A               A
  |     |         |     |
  B     C         C     B
 | |   | |       | |   | |
 D E   F G       G D   E F

左侧二叉树与右侧相似(显然有很多变化!)

这是我到目前为止的伪代码:

if( tree1 == NULL && tree2 == NULL ) return TRUE;

if( tree1 == NULL || tree2 == NULL ) return FALSE;

if( tree1->label != tree2->label ) return FALSE;

return (   TRUE
        && (  (   similarTrees(tree1->left, tree2->left)
               && similarTrees(tree1->right, tree2->right))
            || (   similarTrees(tree1->left, tree2->right)
                && similarTrees(tree1->right, tree2->left))  ));

我的理由是,由于两个左子树可以相等而两个右子树可以相等,或者一个的左右,另一个的左右可以相等,那么这个逻辑递归应该有效......但事实并非如此。

similarTree是递归函数

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

代码和示例不匹配。

如果每个子树包含相同的根标签和相同的子节点,则代码假定树是相等的,尽管是以任意顺序。

另一方面,这个例子不适用于此。例如,在左侧树中,C的子项为FG,而右侧为GD

要编写代码以检查它们是否相似,您必须首先明确定义相似的含义。例如。应该在两棵树上都有标签。它应该存在于同一水平吗?可以不止一次出现吗?

答案 1 :(得分:0)

你可以解决他们第一步的结构是否相同,并使用我的步骤进行第二步

对于树级别,您可以将同一级别的数据收集到同一组(或排序列表)中

显然,如果树的所有级别集都等于另一棵树,并且它们具有相同的结构,那么这两棵树是相似的

答案 2 :(得分:0)

看看breadth first traversal

1。您可以在同一级别上获取元素。

2。然后通过对获得的列表进行排序来比较它们是否具有相同元素的级别。