class Splay { Node root; private Node rotateRight(Node h) { Node x = h.lNode; h.lNode = x.rNode; x.rNode = h; return x; } private Node rotateLeft(Node h) { Node x = h.rNode; h.rNode = x.lNode; x.lNode = h; return x; } private Node splay(Node h, int key) { if (h == null) return null; if (key < h.key) { if (h.lNode == null) { return h; } if (key < h.lNode.key) { h.lNode.lNode = splay(h.lNode.lNode, key); h = rotateRight(h); } else if (key > h.lNode.key) { h.lNode.rNode = splay(h.lNode.rNode, key); if (h.lNode.rNode != null) h.lNode = rotateLeft(h.lNode); } if (h.lNode == null) return h; else return rotateRight(h); } if (key > h.key) { if (h.rNode == null) { return h; } if (key < h.rNode.key) { h.rNode.lNode = splay(h.rNode.lNode, key); if (h.rNode.lNode != null) h.rNode = rotateRight(h.rNode); } else if (key > h.rNode.key) { h.rNode.rNode = splay(h.rNode.rNode, key); h = rotateLeft(h); } if (h.rNode == null) return h; else return rotateLeft(h); } return h; } public void insert(int key) { if (root == null) { root = new Node(key); return; } root = splay(root, key); if (key < root.key) { Node n = new Node(key); n.lNode = root.lNode; n.rNode = root; root.lNode = null; root = n; } else if (key > root.key) { Node n = new Node(key); n.rNode = root.rNode; n.lNode = root; root.rNode = null; root = n; } } public void remove(int key) { if (root == null) return; root = splay(root, key); if (root.key == key) { if (root.lNode == null) { root = root.rNode; } else { Node x = root.rNode; root = root.lNode; root = splay(root, key); root.rNode = x; } } } Node next(int key) { if (root == null) { return null; } root = splay(root, key); return next(key, root); } Node next(int key, Node root) { if (root == null) return null; Node best = null; if (root.key > key) best = root; if (root.key <= key) { Node tryNode = next(key, root.rNode); if (tryNode != null) { if (best == null || tryNode.key < best.key) best = tryNode; } } else { Node tryNode = next(key, root.lNode); if (tryNode != null) { if (best == null || tryNode.key < best.key) best = tryNode; } } return best; } Node prev(int key) { if (root == null) { return null; } root = splay(root, key); return prev(key, root); } Node prev(int key, Node root) { if (root == null) return null; Node best = null; if (root.key < key) best = root; if (root.key < key) { Node tryNode = prev(key, root.rNode); if (tryNode != null) { if (best == null || tryNode.key > best.key) best = tryNode; } } else { Node tryNode = prev(key, root.lNode); if (tryNode != null) { if (best == null || tryNode.key > best.key) best = tryNode; } } return best; } boolean contains(int key) { if (root == null) { return false; } else { root = splay(root, key); if (root.key == key) return true; return false; } } } class Node { int key; Node lNode, rNode; Node(int key) { this.key = key; } }
суббота, 12 мая 2012 г.
Splay-дерево
Подписаться на:
Комментарии к сообщению (Atom)
Огромное спасибо! 3й день искала реализацию этого чуда. и случайно наткнулась на Вашу. Счастью моему нет предела!
ОтветитьУдалитьА у Вас случайно не найдет реализации тех же функций для красно-черного или В-дерева?