【问题标题】:Can I insert data unsorted in Red-black tree?我可以在红黑树中插入未排序的数据吗?
【发布时间】:2011-06-05 23:10:17
【问题描述】:

虽然我仍在努力为this 问题找到解决方案,但我还有另一个可能更容易的解决方案。下面是冈崎红黑树实现的插入函数。我想要做的是在我插入树时保持数据未排序。因此,每次插入时,数据总是会转到最左边/最底部的叶子。无需比较 x y 或 x == y。一开始看起来很简单,只需移除这些保护,然后只做:ins s@(T color a y b) = balance color (ins a) y b。行为似乎是树保持平衡,但颜色变得有点混乱。最终这会影响未来的插入。知道如何实现这一点吗?我认为这可能是我对上一个问题的第一步。我刚开始玩 Haskell,所以我并没有把它简单化。非常感谢。

insertSet x s = T B a y b
  where ins E = T R E x E
        ins s@(T color a y b) =
          if x < y then balance color (ins a) y b
          else if x > y then balance color a y (ins b)
          else s

['d','a','s','f']   s
                   /\
                  a  f
                 /
                d        (unsorted tree)

【问题讨论】:

  • 如果树中的数据是未排序的,那么这棵树就不再是二叉搜索树了。您如何确定一个元素是否已经在树中(无需遍历所有元素)?如果您不想对数据进行排序,那么您可能不想要红黑树。
  • 红黑树适用于 BST,但我想我们可以有一个未排序的二叉树,在这里我想使用相同的 RB 树概念来保持平衡.. 应该有办法保持未排序的二叉树平衡?
  • 当然,平衡的棘手之处在于保持元素排序。如果您不关心树中元素的顺序,您可以随意平衡它。
  • 我和 Cedric 有同样的困惑,但问题是关于使用红黑树实现一个序列(不一定是排序的)。

标签: algorithm haskell red-black-tree


【解决方案1】:

你可以在 haskellDB 中使用我的 RBTree 实现, http://hackage.haskell.org/package/RBTree

使用insert 函数:

insert :: (a -&gt; a -&gt; Ordering) -&gt; RBTree a -&gt; a -&gt; RBTree a

给它一个(\_ _ -&gt; LT) 函数,然后你总是可以把新元素放到最左边的地方。

【讨论】:

  • (由于我在代码中写了很多文档,它们并没有出现在生成的html页面中。您可以阅读源代码以获取更多信息。)
猜你喜欢
  • 2018-11-06
  • 2013-11-17
  • 2013-02-28
  • 2017-07-24
  • 2017-03-16
  • 2015-08-06
  • 2018-05-30
  • 1970-01-01
相关资源
最近更新 更多