| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- public class BasicAVL
- {
- private class AVLNode
- {
- int element;
- int height;
-
- AVLNode leftChild;
- AVLNode rightChild;
-
- public AVLNode(int element)
- {
- this.element = element;
- this.height = 0;
- }
- }
-
- private AVLNode root;
-
- public BasicAVL()
- {
- root = null;
- }
-
- public void insert(int item)
- {
- root = insert(root, item);
- }
-
- private AVLNode insert(AVLNode root, int item)
- {
- if(root == null)
- {
- return new AVLNode(item);
- }
- else if(item < root.element)
- {
- root.leftChild = insert(root.leftChild, item);
- if(root.leftChild.height >= height(root.rightChild) + 2)
- {
- if(item < root.leftChild.element)
- {
- root = rotateWithLeft(root);
- }
- else
- {
- root = doubleRightLeft(root);
- }
- }
-
- }
- else
- {
- root.rightChild = insert(root.rightChild, item);
- if(root.rightChild.height >= height(root.leftChild) + 2)
- {
- if(item < root.rightChild.element)
- {
- root = doubleLeftRight(root);
- }
- else
- {
- root = rotateWithRight(root);
- }
- }
- }
- root.height = Math.max(height(root.leftChild), height(root.rightChild)) + 1;
- return root;
- }
-
- private AVLNode rotateWithRight(AVLNode oldRoot)
- {
- AVLNode newRoot = oldRoot.rightChild;
- oldRoot.rightChild = newRoot.leftChild;
- newRoot.leftChild = oldRoot;
- oldRoot.height = 1 + Math.max(height(oldRoot.leftChild), height(oldRoot.rightChild));
- newRoot.height = 1 + Math.max(height(newRoot.rightChild), newRoot.leftChild.height);
- return newRoot;
- }
-
- private AVLNode rotateWithLeft(AVLNode oldRoot)
- {
- AVLNode newRoot = oldRoot.leftChild;
- oldRoot.leftChild = newRoot.rightChild;
- newRoot.rightChild = oldRoot;
- oldRoot.height = 1 + Math.max(height(oldRoot.leftChild), height(oldRoot.rightChild));
- newRoot.height = 1 + Math.max(height(newRoot.leftChild), newRoot.rightChild.height);
- return newRoot;
- }
-
- private AVLNode doubleLeftRight(AVLNode oldRoot)
- {
- oldRoot.leftChild = rotateWithRight(oldRoot.leftChild);
- return rotateWithLeft(oldRoot);
- }
-
- private AVLNode doubleRightLeft(AVLNode oldRoot)
- {
- oldRoot.rightChild = rotateWithLeft(oldRoot.rightChild);
- return rotateWithRight(oldRoot);
- }
- private int height(AVLNode node)
- {
- return node == null? -1:node.height;
- }
-
- public void print()
- {
- printHelper(root, "");
- }
-
- private void printHelper(AVLNode chkNode, String indent)
- {
- if (chkNode != null)
- {
- System.out.println(indent + chkNode.element);
- indent += " ";
- printHelper(chkNode.leftChild, indent);
- printHelper(chkNode.rightChild, indent);
- }
- }
- }
|