关于二叉搜索树的问题

时间:2010-05-24 23:30:22

标签: data-structures binary-tree

我正在考虑实现二叉搜索树。我已经实现了一些非常基本的操作,如搜索,插入,删除。

请分享您在二叉搜索树上可以执行的所有其他操作的经验,以及每次针对任何特定情况所需的一些实时操作(基本)。我希望我的问题很清楚..

感谢。

7 个答案:

答案 0 :(得分:2)

尝试遍历操作(例如,按顺序将树中的元素作为List返回),并确保在插入/删除元素时树保持平衡。

答案 1 :(得分:2)

您可能想要查看返回树的不同方法:

  • 深度优先(一直沿着一个分支向后移动,重复)
  • 有序(环绕树)
  • 级别顺序(图中绘制的每个级别)
  • 以平面阵列的形式返回。

如果您感觉特别喜欢冒险,请拿一个数组并将其作为树导入。有一个特定的格式,如(1(2(3)),(5) - 这个例子不平衡,但你明白了,它就在维基百科上。

答案 2 :(得分:1)

您可能还想实现旋转操作。 rotation更改结构而不更改元素的顺序。这通常用于平衡树(以确保叶子都接近相同的深度),并且如果您知道它将更频繁地出现在搜索中,也可以用于将根更改为给定元素。 / p>

我的ASCII艺术不是很好,但旋转可以改变这个树:

        f
    d       g
  b   e           
 a c

进入这棵树:

        d
    b       f
  a   c   e   g

平衡的第二棵树会使搜索f和g变慢,并且搜索d,a,b,c的速度会更快。

答案 3 :(得分:0)

至少,二叉搜索树应该具有插入,删除和搜索操作。任何其他操作将取决于您打算如何处理树,尽管一些通用建议是:返回给定节点的父节点,查找给定节点的左右子节点,返回根节点,前序,顺序和后序遍历,以及广度优先的遍历。

答案 4 :(得分:0)

如果这是作业,祝你好运!

如果这很奇怪,那就开心吧!

如果您想在生产代码中实现此功能而不知道基本操作,请不要这样做!

http://www.boost.org/doc/libs/1_38_0/boost/graph/detail/array_binary_tree.hpp

答案 5 :(得分:0)

如果你真的只想要一个可能有用或有趣的东西列表......

  1. 颠倒树中所有内容的顺序。我觉得这是O​​(N)吗?
  2. 子树,x和y之间的元素作为二元搜索树本身 - 我认为应该是O(log N)?
  3. 最小,最大?是的,琐碎的,但我没有想法!

答案 6 :(得分:0)

我想我已经看到某处“地图”操作了。当您使用单调函数更改树的所有元素时。即具有总是上升的属性的函数(f(x + dx)> = f(x))或总是下降(f(x + dx)< = f(x))。在一种情况下,您需要将该函数应用于其他节点,您还需要镜像树(交换“左”和“右”节点),因为结果值的顺序将被反转。

相关问题