【问题标题】:When two trees are equal?当两棵树相等时?
【发布时间】:2010-10-22 21:21:29
【问题描述】:

如果两棵二叉树(不是二叉搜索树)的中序遍历相同,是否保证两棵树相同?

如果答案是否定的,那么中序遍历和前序遍历都一样呢?

【问题讨论】:

    标签: data-structures tree traversal


    【解决方案1】:

    绝对不是。两棵树

      b
     / \
    a   d
       / \
      c   e
    

        d
       / \
      b   e
     / \
    a   c
    

    两者都有a b c d e的中序遍历。它们实际上是旋转,一个操作which preserves inorder traversal

    【讨论】:

      【解决方案2】:

      NO,通过这个简单的例子可以看出

         3            2          
        2           1   3
       1           0
      0  
      

      两者都有相同的inorder遍历[0,1,2,3]

      但如果 inorderpreorder 遍历相同,则树是相等的。

      【讨论】:

      • 或者,如果中序遍历和后序遍历相同,我们得到相同的结论。
      【解决方案3】:

      我在想“不”。

      两棵树的平衡可能不同,但节点值的“顺序”相同。例如,如果,集合

      1,2,3,4,5,6,7
      

      你建一棵树:

               4
            2    6
         1   3  5   7
      

      按顺序遍历将产生 1,2,3,4,5,6,7。

      但是,如果您选择不同的根节点(如果列表没有事先正确排序)

                 5
               4   6
             2       7   
           1   3
      

      这两棵树将给出相同的中序遍历结果,但(显然)不相同。

      甚至

            7
           6
          5
         4
        3
       2
      1
      

      等等。

      这也与 BSP(二进制空间分区)树的问题有关,通常用于游戏开发碰撞检测和可见性确定。

      BSP 将三角形存储在树中。每个节点都包含一个三角形或小平面。左节点包含刻面“后面”的所有子节点,而右子节点包含“前面”的所有子节点。按预期递归。

      如果您选择场景中最左边的切面作为根,那么右边的子节点将拥有所有其他切面。如果你为正确的孩子做出了错误的决定,同样的事情也会发生。完全有可能构建一个 BSP 编译器,通过愚蠢的分析,构建一个实际上是一个列表的“树”(如我上面的最后一个示例)。问题是对数据集进行分区,以便每个节点尽可能平均地划分剩余的列表。这是 BSP 通常在编译时生成的原因之一,因为为非常复杂的几何图形构建 BSP 可能需要数小时才能找到/最佳解决方案。

      【讨论】:

        【解决方案4】:

        中序和前序或后序中的任何一个,唯一地定义一个树结构。一点也不差。

        【讨论】:

          【解决方案5】:

          您可以做的一件事是使用级别顺序 5 4 6 2 7
          1 3

          级别顺序- 5 4 6 2 N N 7 1 3 N N N N N N

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-01-09
            • 2023-03-29
            • 2020-10-11
            • 1970-01-01
            • 2016-01-24
            • 2021-11-24
            • 2012-03-24
            • 2021-08-01
            相关资源
            最近更新 更多