Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.68 KB | None | 0 0
  1. import testSortCol.CollectionWithGet;
  2. import datastructures.BinarySearchTree;
  3.  
  4. public class SplayTree <E extends Comparable<? super E>> extends BinarySearchTree<E> implements CollectionWithGet<E>{
  5.     int no = 0;
  6.     Entry lastEntry;
  7.  
  8.     public SplayTree(){
  9.         super();
  10.     }
  11.  
  12.     @Override
  13.     public Entry find( E elem, Entry t ) {
  14.         no++;
  15.         System.out.println("In find for " + no + "th time");
  16.         if ( t == null ){
  17.             System.out.println("Element not found, splaying last used non-null element");
  18.             if (lastEntry != null){
  19.                 splay(lastEntry);
  20.             }
  21.             return null;
  22.         }
  23.         else {
  24.             int jfr = elem.compareTo( t.element );
  25.  
  26.             if ( jfr  < 0 ){
  27.                 lastEntry = t;
  28.                 return find( elem, t.left );
  29.             }
  30.  
  31.             else if ( jfr > 0 ){
  32.                 lastEntry = t;
  33.                 return find( elem, t.right );
  34.             }
  35.             else {
  36.                 System.out.println("Element found, splaying");
  37.                 splay(t);
  38.                 return t;
  39.             }
  40.         }
  41.     }
  42.  
  43.     private void splay(Entry e){
  44.         Entry parent, gparent;
  45.         if (e != null){
  46.             while (e.parent != null){
  47.                 //System.out.println("Parent of e: " + e.parent);
  48.                 parent = e.parent;
  49.  
  50.                 if (parent.parent != null){
  51.                     gparent = parent.parent;
  52.                     boolean childIsLeft = isLeft(e);
  53.                     boolean parentIsLeft = isLeft(parent);
  54.  
  55.                     if (childIsLeft && parentIsLeft){
  56.                         System.out.println("zagzag");
  57.                         zagZag(gparent);
  58.                     }
  59.                     else if (!childIsLeft && parentIsLeft){
  60.                         System.out.println("zigzag");
  61.                         zagZig(gparent);
  62.                         //zigZag according to reverse system
  63.                         //zigZag(gparent);
  64.                     }
  65.                     else if (childIsLeft && !parentIsLeft){
  66.                         System.out.println("zagig");
  67.                         zigZag(gparent);
  68.                         //zagZig(gparent);
  69.                     }
  70.                     else if (!childIsLeft && !parentIsLeft){
  71.                         System.out.println("zigzig");
  72.                         zigZig(gparent);
  73.                     }
  74.                 } else {
  75.                     if (isLeft(e)){
  76.                         System.out.println("zag");
  77.                         zag(parent);
  78.  
  79.                     }
  80.                     else {
  81.                         System.out.println("zig");
  82.                         zig(parent);
  83.                     }
  84.                 }                      
  85.             }
  86.         }
  87.     }
  88.  
  89.     /**
  90.      * Checks whether an entry is the left or right children of its parent.
  91.      * Throws an IllegalArgumentException if the entry is an orphan.
  92.      * @param e The entry
  93.      * @return True if the entry is the left child, false otherwise.
  94.      */
  95.     private boolean isLeft(Entry e){
  96.         if (e.parent == null){
  97.             throw new IllegalArgumentException("Parent of e = null");
  98.         }
  99.         return (e.parent.left == e);
  100.     }
  101.  
  102.     /* Rotera 1 steg i högervarv, dvs
  103.         x'                 y'
  104.        / \                / \
  105.       y'  C   -->        A   x'
  106.      / \                    / \  
  107.     A   B                  B   C
  108.      */
  109.     private void zag(Entry x ) {
  110.         Entry   y = x.left;
  111.         E    temp = x.element;
  112.  
  113.         x.element = y.element;
  114.         y.element = temp;
  115.         x.left    = y.left; // Y right?
  116.  
  117.         if ( x.left != null ){
  118.             x.left.parent   = x;
  119.         }
  120.  
  121.         y.left    = y.right;
  122.         y.right   = x.right;
  123.  
  124.         if ( y.right != null ){
  125.             y.right.parent  = y;
  126.         }
  127.  
  128.         x.right   = y;
  129.     }
  130.  
  131.     /* Rotera 1 steg i vänstervarv, dvs
  132.         x'                 y'
  133.            / \                / \
  134.       A   y'  -->        x'  C
  135.          / \            / \  
  136.         B   C          A   B  
  137.      */
  138.     private void zig( Entry x ) {
  139.         Entry  y  = x.right;
  140.         E temp    = x.element;
  141.  
  142.         x.element = y.element;
  143.         y.element = temp;
  144.         x.right   = y.right;
  145.  
  146.         if ( x.right != null ){
  147.             x.right.parent  = x;
  148.         }
  149.  
  150.         y.right   = y.left;
  151.         y.left    = x.left;
  152.  
  153.         if ( y.left != null ){
  154.             y.left.parent   = y;
  155.         }
  156.  
  157.         x.left    = y;
  158.     }
  159.  
  160.     private void zigZig(Entry x){
  161.         Entry y = x.right;
  162.         Entry z = y.right;
  163.  
  164.         E temp = z.element;
  165.         z.element = x.element;
  166.         x.element = temp;
  167.  
  168.         Entry tempEntry = y.left;
  169.         y.left = z;  //Switch left/right
  170.         y.right = z.left; // move C
  171.         z.left = x.left; // move A
  172.         x.left = y; //Switch left/right
  173.         x.right = z.right; //move D
  174.         z.right = tempEntry; //move B
  175.  
  176.  
  177.  
  178.     }
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.     /*
  200.                 x                  z
  201.            / \                / \
  202.           A       y      =>      y   D
  203.              / \            / \    
  204.             B   z          x   C
  205.                / \                / \
  206.               C   D      A   B
  207.      */
  208.     /*private void zigZig(Entry x){
  209.                 Entry y = x.right;
  210.                 Entry z = y.right;
  211.                 E e = x.element;
  212.                 System.out.println("x = null:" + (x.element == null));
  213.                 System.out.println("y = null:" + (y.element == null));
  214.                 System.out.println("z = null:" + (z.element == null));
  215.                 x.element = z.element;
  216.                 z.element = e;
  217.  
  218.                 if (y.left != null){
  219.                         y.left.parent = x;
  220.                 }
  221.                 x.right = y.left;
  222.  
  223.                 if (z.left != null){
  224.                         z.left.parent = y;
  225.                 }
  226.                 y.right = z.left;
  227.  
  228.                 z.left = y;
  229.                 y.left = x;
  230.         }*/
  231.  
  232.     /*
  233.                x                  z
  234.           / \                / \
  235.          y       D      =>      A   y
  236.         / \                    / \
  237.        z   C                  B   x
  238.       / \                        / \
  239.      A   B                      C   D
  240.      */
  241.     private void zagZag(Entry x){
  242.         Entry y = x.left;
  243.         Entry z = y.left;
  244.  
  245.         E temp = x.element;
  246.         x.element = z.element;
  247.         z.element = temp;
  248.  
  249.         Entry tempEntry = y.right;
  250.         y.right = z;  //Switch left/right
  251.         y.left = z.right; // move C
  252.         z.right = x.right; // move A
  253.         x.right = y; //Switch left/right
  254.         x.left = z.left; //move D
  255.         z.left = tempEntry; //move B
  256.  
  257.  
  258.  
  259.  
  260.         /*Entry y = x.left;
  261.                 Entry z = y.left;
  262.                 E e = x.element;
  263.                 x.element = z.element;
  264.                 z.element = e;
  265.  
  266.                 if (y.right != null){
  267.                         y.right.parent = x;
  268.                 }
  269.                 x.left = y.right;
  270.  
  271.                 if (z.right != null){
  272.                         z.right.parent = y;
  273.                 }
  274.                 y.left = z.right;
  275.  
  276.                 z.right = y;
  277.                 y.right = x;*/
  278.     }
  279.  
  280.     /* Rotera 2 steg i vänstervarv, dvs
  281.         x'                  z'
  282.        / \                /   \
  283.       A   y'   -->       x'    y'
  284.          / \            / \   / \
  285.         z   D          A   B C   D
  286.        / \  
  287.       B   C  
  288.      */
  289.     private void zigZag(Entry x){
  290.         Entry  y  = x.right,
  291.         z  = x.right.left;
  292.         E      e  = x.element;
  293.         x.element = z.element;
  294.         z.element = e;
  295.         y.left    = z.right;
  296.  
  297.         if ( y.left != null ){
  298.             y.left.parent = y;
  299.         }
  300.  
  301.         z.right   = z.left;
  302.         z.left    = x.left;
  303.  
  304.         if ( z.left != null ){
  305.             z.left.parent = z;
  306.         }
  307.         x.left    = z;
  308.         z.parent  = x;
  309.     }
  310.  
  311.     /* Rotera 2 steg i högervarv, dvs
  312.         x'                  z'
  313.        / \                /   \
  314.       y'  D   -->        y'    x'
  315.      / \                / \   / \
  316.     A   z'             A   B C   D
  317.        / \  
  318.       B   C  
  319.      */
  320.     private void zagZig(Entry x){
  321.         Entry   y = x.left;
  322.         Entry   z = x.left.right;
  323.         if (x == null){
  324.             System.out.println("x = null in zagzig");
  325.         }
  326.         if (y == null){
  327.             System.out.println("y = null in zagzig");
  328.         }
  329.         if (z == null){
  330.             System.out.println("z = null in zagzig");
  331.         }
  332.  
  333.         if ((x.element != null) && (z.element != null)){
  334.             E       e = x.element;
  335.             x.element = z.element;
  336.             z.element = e;
  337.         }
  338.         y.right   = z.left;
  339.  
  340.         if (y.right != null){
  341.             y.right.parent = y;
  342.         }
  343.  
  344.         z.left    = z.right;
  345.         z.right   = x.right;
  346.  
  347.         if ( z.right != null ){
  348.             z.right.parent = z;
  349.         }
  350.  
  351.         x.right   = z;
  352.         z.parent  = x;
  353.     }
  354.  
  355.     @Override
  356.     public E get(E e) {
  357.         Entry elem = find(e,root);
  358.         if (elem != null){
  359.             return find(e, root).element;
  360.         }
  361.         else{
  362.             return null;
  363.         }
  364.     }
  365.  
  366.  
  367.  
  368. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement