Java 如何实现自调整二叉搜索树?
我读了更多关于二元搜索树的内容,然后我发现了二元搜索树的另一个变体,即树,我正在尝试实现它,但不知何故我被卡住了 所以在我看来,算法是- 要将节点x插入到展开树中,请执行以下操作:Java 如何实现自调整二叉搜索树?,java,binary-tree,binary-search-tree,Java,Binary Tree,Binary Search Tree,我读了更多关于二元搜索树的内容,然后我发现了二元搜索树的另一个变体,即树,我正在尝试实现它,但不知何故我被卡住了 所以在我看来,算法是- 要将节点x插入到展开树中,请执行以下操作: 首先插入节点,就像插入普通的二叉搜索树一样 然后将新插入的节点x展开到树的顶部 我想,我能够在上述算法中实现第一点。。但我不确定第二点我该怎么做 public class SplayTreeTest<T extends Comparable<T>> extends BinarySearch
- 首先插入节点,就像插入普通的二叉搜索树一样
- 然后将新插入的节点x展开到树的顶部
public class SplayTreeTest<T extends Comparable<T>> extends BinarySearchTree<SplayTreeTest.TNode<T>,T> {
protected static class TNode<T> extends BinarySearchTree.BSTNode<TNode<T>,T> { }
public SplayTreeTest(Comparator<T> c) {
super(new TNode<T>(), c);
}
public SplayTreeTest() {
this(new DefaultComparator<T>());
}
public void splayIt(TNode<T> u) {
// not sure what should I do here?
// so that addItem and findItem works?
}
public boolean addItem(T x) {
TNode<T> u = newNode(x);
if (!super.add(u)) return false;
splayIt(u);
return true;
}
public T findItem(T x) {
TNode<T> u = super.findLast(x);
if (u != null)
splayIt(u);
return u != null && u.x.equals(x) ? x : null;
}
}
公共类SplayTreeTest扩展了BinarySearchTree{
受保护的静态类TNode扩展了BinarySearchTree.BSTNode{}
公共SplayTreeTest(比较器c){
super(新的TNode(),c);
}
公共SplayTreeTest(){
这个(新的DefaultComparator());
}
公共空间splayIt(TNode u){
//不知道我该怎么办?
//那么addItem和findItem有效吗?
}
公共布尔加法项(T x){
t节点u=新节点(x);
如果(!super.add(u))返回false;
splayIt(u);
返回true;
}
公共T findItem(T x){
TNode u=super.findLast(x);
如果(u!=null)
splayIt(u);
返回u!=null&&u.x.equals(x)?x:null;
}
}
有人能帮我吗?BinarySearchTree代码仅供参考。在我的评论上展开,如果您从这个Splay树开始并插入5,下面是将它放到根目录的步骤:
2 2 2 2 2 5
/ \ / \ / \ / \ / \ / \
1 4 1 4 1 4 1 4 1 5 2 14
\ \ \ \ / \ / \ / \
14 14 14 5 4 14 1 4 6 18
/ \ / \ / \ \ / \ /
6 18 => 6 18 => 5 18 => 14 => 6 18 => 17
/ / / \ / / \ / /
17 5 17 6 17 6 18 17 15
/ / / / /
15 15 15 17 15
/
15
参考实现实现实现自顶向下的展开。即使您在Java中需要它,C也非常适合解决细节问题:请查看的源代码。Splaying类似于自平衡BST中使用的旋转。要将该项目展开到顶部,请将其旋转到根部。查看红黑树和AVL树,了解这些旋转是如何执行的;在这里也是一样,围绕元素的父元素重复左旋转和右旋转,直到它成为新的根。另外,不要忘记,当搜索和找到一个节点时,该节点会向上展开,就像插入一样。