我正在考虑实现二叉搜索树。我已经实现了一些非常基本的操作,如搜索,插入,删除。
请分享您在二叉搜索树上可以执行的所有其他操作的经验,以及每次针对任何特定情况所需的一些实时操作(基本)。我希望我的问题很清楚..
感谢。
答案 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)
如果你真的只想要一个可能有用或有趣的东西列表......
答案 6 :(得分:0)
我想我已经看到某处“地图”操作了。当您使用单调函数更改树的所有元素时。即具有总是上升的属性的函数(f(x + dx)> = f(x))或总是下降(f(x + dx)< = f(x))。在一种情况下,您需要将该函数应用于其他节点,您还需要镜像树(交换“左”和“右”节点),因为结果值的顺序将被反转。