【问题标题】:Convert Binary Tree -> BST (maintaining original tree shape)转换二叉树 -> BST(保持原始树形)
【发布时间】:2010-08-20 14:05:53
【问题描述】:

我有一棵某种形状的二叉树。我想将其转换为相同形状的 BST 搜索树。是否可以?

我试过这样的方法 -

  • 按顺序遍历二叉树并将内容放入数组中。然后将其映射到 BST 中,记住条件(left val

P.S.:我看过这个 - Binary Trees question. Checking for similar shape。但是很容易比较 2 个 BST 的形状相似性。

【问题讨论】:

    标签: algorithm data-structures tree binary-tree


    【解决方案1】:

    简短的回答是:你不能。 BST 要求节点遵循左 http://upload.wikimedia.org/wikipedia/commons/f/f7/Binary_tree.svg,如果您尝试使用相同的形状构建 BST,您会发现您做不到。

    但是,如果您想扩展 BST 的定义,使其允许 left

    // t is your non-BST tree, a is an array containing the sorted elements of t, i is the current index into a
    index i = 0
    create_bst(Tree t, Array a)
    {
      if(t is NIL)
        return;
      create_bst(t->left, a)
      t->data = a[i]
      i++
      create_bst(t->right, a)
    }
    

    但是,结果不会是真正的 BST。如果您想要一个尽可能接近原始形状的真正 BST,那么您再次将元素放入排序数组中,但这次将它们插入到 BST 中。插入它们的顺序由原始树的子树的大小定义。这是一些伪代码:

    // left is initially set to 0
    create_true_bst(Tree t, BST bt, array a, index left)
    {
      index i = left + left_subtree(t)->size
      bt->insert(a[i])
      if(left_subtree(t)->size != 0)
      {
        create_true_bst(t->left, bt, a, left)
        create_true_bst(t->right, bt, a, i + 1)
      }
    }
    

    但这并不能保证形状是相同的。

    【讨论】:

      【解决方案2】:

      提取树的所有元素,然后对其进行排序,然后使用递归中序过程替换值。

      【讨论】:

        【解决方案3】:

        如果您正确实施,您描述的方法可以保证有效。二叉树的遍历顺序是唯一的,并且定义了元素的顺序。如果您按值对元素进行排序,然后根据该顺序将它们插入,那么

        left subtree <= root <= right subtree
        

        对于每个节点,假设这是您遍历它们的顺序,并且假设您按该顺序对它们进行了排序。

        【讨论】:

        • 我试过了。也许我犯了一些简单的错误。让我们以这里介绍的二叉树 - upload.wikimedia.org/wikipedia/commons/f/f7/Binary_tree.svg 在按顺序遍历后得到 (2,7,5,6,11,2,5,4,9) 作为数组。经过这种排序?排序不会使一切都增加吗?然后 BST 最终会成为一个链表?
        • 排序得到 (2,2,4,5,5,6,7,9,11)。 按照您在树中读取它们的相同顺序放回,即 2->2、7->2、5->4、6->5、11->5、2-> 6、5->7、4->9、9->11。然后你的树看起来像 6,L(2,L(2),R(5,L(5),R(5))),R(9,L(7),R(11))。
        【解决方案4】:

        我会简单地进行两次按顺序遍历。在第一次遍历中,从树中获取值并将它们放入堆中。其次,从堆中按顺序获取值并将它们放入树中。这在 O(n·log n) 时间和 O(n) 空间中运行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-01-31
          • 2021-09-28
          • 1970-01-01
          • 1970-01-01
          • 2013-01-08
          • 2012-02-28
          • 2012-05-13
          相关资源
          最近更新 更多