Splay tree的splay操作

splay tree 主要适用于对统一对象的连续读取
splay(insertNode) 操作 就是将当前节点移动到 root节点


public class SplayTree<T> {
    private Node<T> root = null;

    /**
     * @param insertNode
     */
    public void splayTree(Node<T> insertNode){
        if(insertNode.parent!=null){
            if(insertNode.parent.parent==null){
/*            parent
 *              /
 *         insert
 * */
                if(insertNode.parent.index>insertNode.index){
                    rotateRight(insertNode);
                }
/*      parent
 *          \
 *          insert
 * */
                else{
                    rotateLeft(insertNode);
                }
            }else{
                if(insertNode.parent.index>insertNode.index){

                    if(insertNode.parent.parent.index>insertNode.parent.index){
/*                grandfather               parent                    insert
 *                /                         /   \                           \
 *              parent                  insert  grandfather             parent
 *              /                                                            \
 *          insert                                                    grandfather
 * */

                            rotateRight(insertNode.parent);
                            rotateRight(insertNode);

                    }
/*
 *         grandfather         grandfather                insert
 *              \                    \                      /  \            
 *              parent              insert          grandfather  parent
 *              /                       \
 *          insert                  parent
 * */
                    else{
                        rotateRight(insertNode);
                        rotateLeft(insertNode);
                    }
                    if(insertNode.parent!=null){
                        splayTree(insertNode);
                    }
                }else{
/*
 *       grandfather            grandfather                   insert
 *              /                  /                            /  \    
 *          parent              insert                   parent     grandfather
 *              \               /
 *              insert     parent
 * */
                    if(insertNode.parent.parent.index>insertNode.parent.index){
                        rotateLeft(insertNode);
                        rotateRight(insertNode);
                    }
/*
 *      grandfather                      parent                          insert
 *          \                           /       \                       /       
 *          parent                  grandfather  insert             parent
 *              \insert                                             /
 *                                                          grandfather
 * **/
                    else{
                        rotateLeft(insertNode.parent);
                        rotateLeft(insertNode);
                    }
                    if(insertNode.parent!=null){
                        splayTree(insertNode);
                    }
                }
            }
        }
        root=insertNode;
    }
    /**
     * @param itemNode
     */
    public void rotateRight(Node<T> itemNode){
        Node<T> parent=itemNode.parent;
        Node<T> grandParent=parent.parent;
        Node<T> right=itemNode.right;
        parent.parent=itemNode;
        itemNode.right=parent;
        parent.left=right;
        if(right!=null){
            right.parent=parent;
        }
        itemNode.parent=grandParent;
        if(grandParent!=null){
            if(grandParent.index>itemNode.index){
                grandParent.left=itemNode;
            }else{
                grandParent.right=itemNode;
            }
        }
    }
    public void rotateLeft(Node<T> itemNode){
        Node<T> parent=itemNode.parent;
        Node<T> grandParent=parent.parent;
        Node<T> left=itemNode.left;
        parent.parent=itemNode;
        itemNode.left=parent;
        parent.right=left;
        if(left!=null){
            left.parent=parent;
        }
        itemNode.parent=grandParent;
        if(grandParent!=null){
            if(grandParent.index>itemNode.index){
                grandParent.left=itemNode;
            }else{
                grandParent.right=itemNode;
            }
        }
    }

    public static class Node<T> {
        Node<T> parent;
        int index;
        T t;
        Node<T> left;
        Node<T> right;
        public Node(Node<T> parent, int index, T t) {
            super();
            this.parent = parent;
            this.index = index;
            this.t = t;
        }

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值