我必须使用Java实现splay树结构。 给定一个名为Node的类,它具有:
我的作业是创建“插入”方法。
我已经尝试了一些策略,但是到目前为止还没有奏效,我试图获得一些帮助而不是通过获取代码,而是获得一些可以帮助我的想法。
所以我最初的策略是实现一种递归方法,像插入二叉搜索树一样插入信息,然后展开(使用伪代码):
Node splay(Node a, int x):
if a.height >=3:{
if (there is a node from "a" with the structure of zigzig or zigzag with x info){
return a(do the rotation)}
}
else:{
return Node(splay(a.left,x),a.info,splay(a.right,x))}
我不能完全确定这个想法是否适用于锯齿形和锯齿形。
另一方面,我没有Node的父节点的信息,因此我在如何进行Zig和Zag旋转时遇到了麻烦,我尝试使用a.height == 1,但这会遇到麻烦< / p>
答案 0 :(得分:0)
您在此处描述的策略称为自底向上展开,这是查看展开内容的最常见方法。您可以进行常规查找以找到所需的节点,然后应用剧本中的规则(zig,zig-zag或zig-zig)将节点拉到树的根。
还有另一种策略可以用来实现扩展,称为 top-down splaying ,该策略通过在从根节点遍历到目标节点时重塑树来实现扩展。您可以通过将树分成两棵树(称为左树和右树),然后通过将这些树智能地组合在一起来完成splay来实现splay操作。这不需要使用递归,并且不需要父指针。您可以在section 4 of Sleator and Tarjan's original paper on splay trees中找到有关如何执行此操作的详细信息。那里的伪代码不能一对一地翻译成Java(例如,它们有一个名为“ null”的显式节点,假定您可以调整其左右子级),但是基本思想还不错您已经检查了他们的数据并完成了所有案例。