【问题标题】:how to see if 2 binary trees are similar?如何查看2个二叉树是否相似?
【发布时间】:2015-12-27 04:53:36
【问题描述】:

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

例子

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

感谢您的帮助!

【问题讨论】:

  • 一个小提示:您不需要TRUE && (...) 表达式。只返回没有TRUE && 部分的实际表达式。

标签: c binary-tree


【解决方案1】:

代码和示例不匹配。

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

另一方面,这个例子并不适用于此。例如在左边的树中,C 的子节点是 FG,而在右边的树中 GD

要编写代码来检查这些是否相似,您必须首先明确定义相似的含义。例如。两个树中是否都存在标签。它应该存在于同一级别吗?可以多次出现吗?

【讨论】:

  • 代码很可能不正确...我对相似性的定义是结构相同。意思是,如果一棵树有一个左孩子 null 和右孩子,那么另一棵树也必须有一个左孩子 null 和右孩子(只是一个任意示例)。第二个定义是在树的层级中某处必须有一个相同值的标签。例如,在那个例子中...... A 不能与任何东西交换...... B & C 只能相互交换...... D、E、F、G 都可以在任何变化中相互交换.顺便说一句,谢谢你的帮助!
  • 在这种情况下,我建议您遍历树,在每个级别上累积节点。结果将是节点集合的集合。一旦你完成了这三个,你可以比较集合。当然,无论内部顺序如何,集合都必须被视为相等。例如,左边的示例树可以收集到:[[A], [B, C], [D, E, F, G]] 和右边的[[A], [C, B], [G, D, E, F]],它们是相似的(因为标签的顺序在每个集合中被忽略)。
  • 我想出了一个更好的方法。由于我们使用的是二叉树,而不是创建新的数据结构,我会将两棵树都转储到 2 棵虚拟树中。然后我将对这两个虚拟树进行递归排序,并根据级别对它们进行排序。然后我会比较两个虚拟树的相同性。顺序是首先检查结构是否正确,然后对虚拟树进行排序。感谢您的帮助!
【解决方案2】:

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

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

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

【讨论】:

  • 拥有相同的集合并不意味着拥有相同的结构。
【解决方案3】:

看看breadth first traversal

1.你可以获取同一层级的元素。

2.然后通过对得到的列表进行排序,比较层级是否具有相同的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2021-08-01
    • 2015-04-23
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 2018-05-16
    相关资源
    最近更新 更多