Advertisement
Guest User

Untitled

a guest
Oct 4th, 2015
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.90 KB | None | 0 0
  1. package dancers;
  2.  
  3. import dancers.Dancer;
  4. import dancers.IDancer;
  5. import dancers.IDancers;
  6.  
  7. import java.util.AbstractMap;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import java.util.function.Consumer;
  11.  
  12. /**
  13.  * Created by kaarel on 04/10/15.
  14.  */
  15. public class Dancers implements IDancers {
  16.     private Dancer root;
  17.  
  18.     public Dancer getRoot() {
  19.         return root;
  20.     }
  21.  
  22.     public Dancer add(Dancer node) {
  23.         if(root == null)
  24.             root = node;
  25.         else
  26.             add(root, node);
  27.  
  28.         return node;
  29.     }
  30.  
  31.     public Dancer add(Dancer root, Dancer node) {
  32.         int comparison = node.compareTo(root);
  33.  
  34.         if(comparison < 0) {
  35.             if(root.getLeft() == null)
  36.                 root.setLeft(node);
  37.             else
  38.                 add(root.getLeft(), node);
  39.         } else {
  40.             if(root.getRight() == null)
  41.                 root.setRight(node);
  42.             else
  43.                 add(root.getRight(), node);
  44.         }
  45.  
  46.         return node;
  47.     }
  48.  
  49.     public Dancer findPartnerFor(int height, boolean male) {
  50.         return null;
  51.     }
  52.  
  53.     public Dancer minimum(Dancer node) {
  54.         while(node.getLeft() != null)
  55.             node = node.getLeft();
  56.  
  57.         return node;
  58.     }
  59.  
  60.     public Dancer maximum(Dancer node) {
  61.         while(node.getRight() != null)
  62.             node = node.getRight();
  63.  
  64.         return node;
  65.     }
  66.  
  67.     public Dancer successor(Dancer node) {
  68.         if(node.getRight() != null)
  69.             return minimum(node.getRight());
  70.  
  71.         Dancer parent = node.getParent();
  72.  
  73.         while(parent != null && node == parent.getRight()) {
  74.             node = parent;
  75.             parent = parent.getParent();
  76.         }
  77.  
  78.         return parent;
  79.     }
  80.     public Dancer predecessor(Dancer node) {
  81.         if(node.getLeft() != null)
  82.             return minimum(node.getLeft());
  83.  
  84.         Dancer parent = node.getParent();
  85.  
  86.         while(parent != null && node == parent.getLeft()) {
  87.             node = parent;
  88.             parent = parent.getParent();
  89.         }
  90.  
  91.         return parent;
  92.     }
  93.  
  94.     public void delete(Dancer node) {
  95.         if(node.getLeft() == null && node.getRight() == null) {
  96.             replaceSubtree(node, null);
  97.         } else if(node.getLeft() == null) {
  98.             replaceSubtree(node, node.getRight());
  99.         } else if(node.getRight() == null) {
  100.             replaceSubtree(node, node.getLeft());
  101.         } else {
  102.             Dancer successor = successor(node);
  103.  
  104.             node.replace(successor);
  105.             replaceSubtree(successor, successor.getRight());
  106.         }
  107.     }
  108.  
  109.     public void replaceSubtree(Dancer node, Dancer replacement) {
  110.         Dancer parent = node.getParent();
  111.  
  112.         if(parent == null)
  113.             root = replacement;
  114.         else if(node == parent.getLeft())
  115.             parent.setLeft(replacement);
  116.         else
  117.             parent.setRight(replacement);
  118.  
  119.         if(replacement != null)
  120.             replacement.setParent(parent);
  121.     }
  122.  
  123.     public void traverse(Consumer<Dancer> consumer) {
  124.         traverse(root, consumer);
  125.     }
  126.  
  127.     public void traverse(Dancer node, Consumer<Dancer> consumer) {
  128.         if(node == null)
  129.             return;
  130.  
  131.         traverse(node.getLeft(), consumer);
  132.         consumer.accept(node);
  133.         traverse(node.getRight(), consumer);
  134.     }
  135.  
  136.     public List<Dancer> toList() {
  137.         ArrayList<Dancer> list = new ArrayList<>();
  138.  
  139.         traverse(list::add);
  140.  
  141.         return list;
  142.     }
  143.  
  144.     @Override
  145.     public AbstractMap.SimpleEntry<IDancer, IDancer> findPartnerFor(IDancer dancer) throws IllegalArgumentException {
  146.         add((Dancer) dancer);
  147.  
  148.  
  149.         if(!dancer.isMale()) {
  150.             Dancer successor = successor((Dancer) dancer);
  151.  
  152.             while (true) {
  153.                 if(successor == null || successor.isMale())
  154.                     break;
  155.  
  156.                 successor = successor(successor);
  157.             }
  158.  
  159.             if(successor != null) {
  160.                 delete((Dancer) dancer);
  161.                 delete((Dancer) successor);
  162.  
  163.                 return new AbstractMap.SimpleEntry<>(dancer, successor);
  164.             }
  165.         } else {
  166.             Dancer predecessor = predecessor((Dancer) dancer);
  167.  
  168.             while (true) {
  169.                 if(predecessor == null || (!predecessor.isMale() && (predecessor.getHeight() < dancer.getHeight())))
  170.                     break;
  171.  
  172.                 predecessor = predecessor(predecessor);
  173.             }
  174.  
  175.             if(predecessor != null) {
  176.                 delete((Dancer) dancer);
  177.                 delete((Dancer) predecessor);
  178.  
  179.                 return new AbstractMap.SimpleEntry<>(dancer, predecessor);
  180.             }
  181.         }
  182.  
  183.         return null;
  184.     }
  185.  
  186.     @Override
  187.     public List<IDancer> returnWaitingList() {
  188.         ArrayList<IDancer> list = new ArrayList<>();
  189.  
  190.         traverse(list::add);
  191.  
  192.         return list;
  193.     }
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement