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

时间:2014-03-04 01:15:03

标签: java binary-tree binary-search-tree

我在二进制搜索树上阅读了更多内容然后我发现了另一个二叉搜索树的变种Splay树,我正在尝试实现它,但不知怎的,我卡住了。

所以看我的算法是 -

将节点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;
    }   
}

任何人都可以帮我吗? BinarySearchTree代码为here供参考。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

参考实现实现自上而下的splaying。即使你需要Java,C reference implementation也非常适合编写细节:

答案 2 :(得分:0)

查看java.util.TreeMap的源代码。