Java 如何实现自调整二叉搜索树?

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插入到展开树中,请执行以下操作:

  • 首先插入节点,就像插入普通的二叉搜索树一样
  • 然后将新插入的节点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树,了解这些旋转是如何执行的;在这里也是一样,围绕元素的父元素重复左旋转和右旋转,直到它成为新的根。另外,不要忘记,当搜索和找到一个节点时,该节点会向上展开,就像插入一样。