C 如何查看两个二叉树是否相似?

C 如何查看两个二叉树是否相似?,c,binary-tree,C,Binary Tree,我需要检查两个二叉树,看看它们是否相似。。。这意味着如果它们具有完全相同的结构,然后数据处于相同的级别(但数据不需要处于相同的结构中) 范例 A A | | | | B C C B | | | | | | | | D E F G G D E F 左二叉树与右二叉树相似(显然有很多变体!) 以下是迄今为止我掌握的伪代码: if( tree1 =

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

范例

     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是递归函数


谢谢你的帮助

第一步可以解决它们是否相同,第二步可以使用我的步骤

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


显然,如果一棵树的所有级别集等于另一棵树的所有级别集,并且它们具有相同的结构,那么这两棵树是相似的,代码和示例不匹配

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

另一方面,这个例子并不适用于这一点。例如,在左边的树中,
C
的子级是
F
G
,而在右边的
G
D

要编写代码检查这些是否相似,必须首先明确定义相似的含义。例如,两棵树中是否都存在标签。它是否应该存在于同一级别?它会不止一次发生吗?

看一看

1。您可以获得相同级别的元素


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

一个小提示:您不需要
TRUE&&(…)
表达式。只需返回实际表达式,不带
TRUE&
部分。具有相同的集合并不意味着具有相同的结构。代码很可能不正确。。。我对相似性的定义是结构是相同的。也就是说,如果一棵树有左子null和右子,那么另一棵树也必须有左子null和右子(只是一个任意示例)。第二个定义是,在树级别的某个位置必须有一个相同值的标签。例如,在那个例子中。。。A不能与任何东西交换。。。B&C只能相互交换。。。D、 E、F、G都可以在任何变化中相互交换。顺便说一句,谢谢你的帮助!在这种情况下,我建议您遍历树,在每个级别上累积节点。结果将是节点集合的集合。一旦对这两个三个进行了比较,就可以比较集合了。当然,无论内部顺序如何,集合都必须被视为相等的。例如,左边的示例树可以被收集到:
[[A],[B,C],[D,E,F,G]
和右边的
[[A],[C,B],[G,D,E,F]
,它们是相似的(因为在每个集合中标签的顺序被忽略)。我找到了一个更好的方法。因为我们使用的是二叉树,所以我不会创建新的数据结构,而是将这两棵树都转储到两个虚拟树中。然后,我将递归地对两个虚拟树进行排序,并根据级别对它们进行排序。然后我会比较两个虚拟树的一致性。顺序是首先检查结构是否正确,然后对虚拟树进行排序。谢谢你的帮助!