如何实现自适应二叉搜索树?

3
我正在阅读有关二叉搜索树的更多内容,然后发现了另一种变体Splay树,我正在尝试实现它,但某种程度上卡住了。
所以,我认为算法如下:
要将节点x插入Splay树中:
  • 首先像普通的二叉搜索树一样插入节点。
  • 然后将新插入的节点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;
    }   
}

有人能帮我吗?二叉搜索树代码在这里作为参考。


1
Splaying与自平衡二叉搜索树中使用的旋转类似。为了将该项旋转到顶部,您需要将其旋转到根。请查看红黑树和AVL树,以了解如何执行这些旋转;在这里,重复左右旋转元素的父级,直到它成为新的根节点。 - Jonathan E. Landrum
此外,不要忘记当搜索并找到一个节点时,该节点会像插入一样被伸展到顶部。 - Jonathan E. Landrum
3个回答

1

扩展我的评论,如果您从这个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

0

参考实现采用自上而下的伸展算法。即使需要在Java中使用,C语言参考实现也非常适合解决细节问题:


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接