Advertisement
Guest User

Untitled

a guest
Nov 12th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.33 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. public class Tipp<T extends Comparable> {
  4.  
  5.     private Integer info;
  6.     private Tipp<T> vasakAlluv;
  7.     private Tipp<T> paremAlluv;
  8.  
  9.     //Loob lehe
  10.     public Tipp(Integer info) {
  11.         this(info, null, null);
  12.     }
  13.  
  14.     //Loob vahetipu kahe alamtipuga
  15.     public Tipp(Integer info, Tipp vasakAlluv, Tipp paremAlluv) {
  16.         this.info = info;
  17.         this.vasakAlluv = vasakAlluv;
  18.         this.paremAlluv = paremAlluv;
  19.     }
  20.  
  21.     //tagastab tipu väärtuse
  22.     public Integer getInfo() {
  23.         return info;
  24.     }
  25.  
  26.     //tagastab tipu kõrguse vaadates mõlemat alluvat
  27.     public int kõrgus() {
  28.         int vasakKõrgus = vasakAlluv == null ? 0 : vasakAlluv.kõrgus();
  29.         int paremKõrgus = paremAlluv == null ? 0 : paremAlluv.kõrgus();
  30.         return Math.max(paremKõrgus, vasakKõrgus)+1;
  31.     }
  32.  
  33.     public int getKõrgus() {
  34.  
  35.         int vasakKorgus = 0;
  36.         int paremKorgus = 0;
  37.  
  38.  
  39.         if (vasakAlluv == null) {
  40.             vasakKorgus = 0;
  41.         }
  42.         if (vasakAlluv != null) {
  43.             vasakKorgus = vasakAlluv.kõrgus();
  44.         }
  45.         if (paremAlluv == null) {
  46.             paremKorgus = 0;
  47.         }
  48.         if (paremAlluv != null) {
  49.             paremKorgus = paremAlluv.kõrgus();
  50.         }
  51.         return 1 + Math.max(vasakKorgus, paremKorgus);
  52.     }
  53.  
  54.     //tagastab kogu puu tippude arvu
  55.     private int tippudeArv() {
  56.         int vasakul = this.vasakAlluv == null ? 0 : this.vasakAlluv.tippudeArv();
  57.         int paremal = this.paremAlluv == null ? 0 : this.paremAlluv.tippudeArv();
  58.         return vasakul + paremal + 1;
  59.     }
  60.  
  61.     //Genereerib juhusliku puu etteantud kõrguse põhjal
  62.     public static Tipp<Integer> juhuslikPuu(int h) {
  63.         if (h < 0) return null;
  64.         if (h == 0) return new Tipp<>(0);
  65.         Random r = new Random();
  66.         Integer juhuslikArv = r.nextInt(3);
  67.         switch (juhuslikArv) {
  68.             case 0:
  69.                 return new Tipp<>(0, juhuslikPuu(h - 1), juhuslikPuu(h - 1));
  70.             case 1:
  71.                 return new Tipp<>(0, juhuslikPuu(h - 1), juhuslikPuu(h - 2));
  72.             default:
  73.                 return new Tipp<>(0, juhuslikPuu(h - 2), juhuslikPuu(h - 1));
  74.         }
  75.     }
  76.  
  77.     public Integer täidaArvudega(Tipp<Integer> puu, Integer n) {
  78.         if (puu.vasakAlluv != null) {
  79.             n = täidaArvudega(puu.vasakAlluv, n);
  80.             puu.setInfo(n);
  81.             n++;
  82.             if (puu.paremAlluv != null) {
  83.                 n = täidaArvudega(puu.paremAlluv, n);
  84.             }
  85.         } else {
  86.             puu.setInfo(n);
  87.             n++;
  88.             if (puu.paremAlluv == null) {
  89.                 return n;
  90.             } else {
  91.                 n = täidaArvudega(puu.paremAlluv, n);
  92.             }
  93.         }
  94.         return n;
  95.  
  96.     }
  97.  
  98.     //Meetod, mis tagastab booleani, kas puude struktuur ja tippude infod on samad
  99.     public boolean equals(Tipp<T> teine) {
  100.         return onVõrdsed(this, teine);
  101.     }
  102.  
  103.     //Abimeetod equals käsklusele
  104.     private boolean onVõrdsed(Tipp<T> esimene, Tipp<T> teine) {
  105.         if (esimene == null) {
  106.             return teine == null;
  107.         }
  108.         return teine != null &&
  109.                 esimene.getInfo().equals(teine.getInfo()) &&
  110.                 onVõrdsed(esimene.getVasakAlluv(), teine.getVasakAlluv()) &&
  111.                 onVõrdsed(esimene.getParemAlluv(), teine.getParemAlluv());
  112.     }
  113.  
  114.     //otsib tipu info põhjal tippu. Tagastab selle, kui leiab või null
  115.     private Tipp<T> otsiKirje(Tipp<T> tipp, Integer kirje) {
  116.         if (tipp == null) {
  117.             return null;
  118.         }
  119.         if (tipp.getInfo().equals(kirje)) {
  120.             return tipp;
  121.         }
  122.         if (kirje < tipp.getInfo()) {
  123.             return otsiKirje(tipp.vasakAlluv, kirje);
  124.         } else {
  125.             return otsiKirje(tipp.paremAlluv, kirje);
  126.         }
  127.     }
  128.  
  129.     private Tipp<T> otsiVanem(Tipp<T> tipp, Tipp<T> vanem, Integer kirje) {
  130.         if (tipp == null) {
  131.             return null;
  132.         }
  133.         if (tipp.getInfo().equals(kirje)) {
  134.             return vanem;
  135.         }
  136.         if (kirje < tipp.getInfo()) {
  137.             return otsiVanem(tipp.vasakAlluv, tipp, kirje);
  138.         } else {
  139.             return otsiVanem(tipp.paremAlluv, tipp, kirje);
  140.         }
  141.     }
  142.  
  143.     //tagastab vasaku alluva
  144.     public Tipp<T> getVasakAlluv() {
  145.         return vasakAlluv;
  146.     }
  147.  
  148.     //tagastab parema alluva
  149.     public Tipp<T> getParemAlluv() {
  150.         return paremAlluv;
  151.     }
  152.  
  153.     //paneb tipule täisarvulise väärtuse
  154.     private void setInfo(Integer info) {
  155.         this.info = info;
  156.     }
  157.  
  158.     //muudab vasakut alluvat
  159.     public void setVasakAlluv(Tipp<T> vasakAlluv) {
  160.         this.vasakAlluv = vasakAlluv;
  161.     }
  162.  
  163.     //muudab paremat alluvat
  164.     public void setParemAlluv(Tipp<T> paremAlluv) {
  165.         this.paremAlluv = paremAlluv;
  166.     }
  167.  
  168.     //võtab sisendiks mingi tipu (juur) ja uue tipu info
  169.     private Tipp<T> lisaKirje(Tipp<T> tipp, Integer tipuKirje) {
  170.         Tipp<T> lisatudTipp;
  171.         if (tipp == null) {
  172.             return new Tipp<T>(tipuKirje);
  173.         } else {
  174.             if (tipuKirje >= tipp.getInfo()) {
  175.                 lisatudTipp = lisaKirje(tipp.paremAlluv, tipuKirje);
  176.                 if (tipp.paremAlluv == null) {
  177.                     tipp.setParemAlluv(lisatudTipp);
  178.                 }
  179.             } else {
  180.                 lisatudTipp = lisaKirje(tipp.vasakAlluv, tipuKirje);
  181.                 if (tipp.vasakAlluv == null) {
  182.                     tipp.setVasakAlluv(lisatudTipp);
  183.                 }
  184.             }
  185.         }
  186.         return tasakaalusta(tipp);
  187.     }
  188.  
  189.     private Tipp<T> tasakaalusta(Tipp<T> tipp) {
  190.         System.out.println("tasakaalustan");
  191.         Tipp<T> parem = tipp.getParemAlluv();
  192.         Tipp<T> vasak = tipp.getVasakAlluv();
  193.         Integer vasakKõrgus = vasak == null ? 0 : vasak.kõrgus();
  194.         Integer paremKõrgus = parem == null ? 0 : parem.kõrgus();
  195.         System.out.println(vasakKõrgus);
  196.         System.out.println(paremKõrgus);
  197.  
  198.         if(vasakKõrgus - paremKõrgus == -2){
  199.             Integer paremParemKõrgus;
  200.             Integer paremVasakKõrgus;
  201.             if(parem != null) {
  202.                 paremParemKõrgus = parem.paremAlluv == null ? 0 : parem.paremAlluv.kõrgus();
  203.                 paremVasakKõrgus = parem.vasakAlluv == null ? 0 : parem.vasakAlluv.kõrgus();
  204.             }
  205.             else {
  206.                 paremParemKõrgus = -1;
  207.                 paremVasakKõrgus = -1;
  208.             }
  209.  
  210.             if(paremVasakKõrgus - paremParemKõrgus == -1 || paremVasakKõrgus - paremParemKõrgus == 0){
  211.                 System.out.println("vasakpööre");
  212.                 return tipp.vasakPoore();
  213.             }
  214.             else if(paremVasakKõrgus - paremParemKõrgus == 1){
  215.                 System.out.println("paremvasak pööre");
  216.                 return tipp.paremVasakPoore();
  217.             }
  218.         }
  219.  
  220.         else if(vasakKõrgus - paremKõrgus == +2){
  221.             Integer vasakVasakKõrgus;
  222.             Integer vasakParemKõrgus;
  223.             if(vasak != null) {
  224.                 vasakParemKõrgus = vasak.paremAlluv == null ? -1 : vasak.paremAlluv.kõrgus();
  225.                 vasakVasakKõrgus = vasak.vasakAlluv == null ? -1 : vasak.vasakAlluv.kõrgus();
  226.             }
  227.             else {
  228.                 vasakVasakKõrgus = -1;
  229.                 vasakParemKõrgus = -1;
  230.             }
  231.  
  232.             if(vasakVasakKõrgus - vasakParemKõrgus == -1) {
  233.                 System.out.println("vasakparem pööre");
  234.                 return tipp.vasakParemPoore();
  235.             }
  236.             else if(vasakVasakKõrgus - vasakParemKõrgus == 0 || vasakVasakKõrgus - vasakParemKõrgus == 1) {
  237.                 System.out.println("parempööre");
  238.                 return tipp.paremPoore();
  239.             }
  240.         }
  241.         return null;
  242.     }
  243.  
  244.     public Tipp<T> eemaldaTipp(Tipp<T> tipp) {
  245.         System.out.println("eemaldan tippu");
  246.         // panen tühikud edaspidi erinevate funktsioonidega koodijuppide vahele
  247.         // nagu tahaks eraldada koodijuppe, millele mingi kommentaar/selgitus rakendub :))))))))))))
  248.         Tipp<T> eemaldatav = otsiKirje(this, tipp.getInfo());
  249.  
  250.  
  251.         //kui eemaldataval tipul ei ole alluvaid
  252.         if (eemaldatav.vasakAlluv == null && eemaldatav.paremAlluv == null) {
  253.             Tipp<T> vanem = otsiVanem(this, null, tipp.getInfo());
  254.             if(vanem == null){
  255.                 return null;
  256.             }
  257.             if (vanem.paremAlluv != null && vanem.paremAlluv.equals(tipp)) {
  258.                 vanem.setParemAlluv(null);
  259.             } else {
  260.                 vanem.setVasakAlluv(null);
  261.             }
  262.             return tasakaalusta(vanem);
  263.         }
  264.  
  265.         //Kui eemaldataval tipul on vaid vasakalluv
  266.         else if (eemaldatav.paremAlluv == null) {
  267.             System.out.println("on vasakalluv");
  268.             Tipp<T> vanem = otsiVanem(this, null, tipp.getInfo());
  269.             vanem.setVasakAlluv(eemaldatav.vasakAlluv);
  270.             //return tasakaalusta(vanem.vasakAlluv);
  271.             return tasakaalusta(vanem);
  272.         }
  273.  
  274.         //Kui eemaldataval tipul on vaid paremalluv
  275.         else if (eemaldatav.vasakAlluv == null) {
  276.             System.out.println("on paremalluv");
  277.             Tipp<T> vanem = otsiVanem(this, null, tipp.getInfo());
  278.             vanem.setParemAlluv(eemaldatav.paremAlluv);
  279.             return tasakaalusta(vanem);
  280.         }
  281.  
  282.         //Kui eemaldataval tipul on kaks alluvat
  283.         else {
  284.             System.out.println("on mõlemad alluvad");
  285.             //otsib keskjärjestuses järgmist tippu
  286.             Tipp<T> puhver;
  287.             if (eemaldatav.paremAlluv.vasakAlluv != null) {
  288.                 puhver = eemaldatav.paremAlluv.vasakAlluv;
  289.                 while (puhver.vasakAlluv != null) {
  290.                     puhver = puhver.vasakAlluv;
  291.                 }
  292.             }
  293.             else {
  294.                 puhver = eemaldatav.paremAlluv;
  295.             }
  296.             Integer puhvriInfo = puhver.getInfo();
  297.             eemaldaTipp(puhver);
  298.             System.out.println(puhvriInfo);
  299.             eemaldatav.setInfo(puhvriInfo);
  300.         }
  301.         System.out.println("pole alluvaid");
  302.         return tasakaalusta(this);
  303.     }
  304.  
  305.     private Tipp<T> vasakPoore() {
  306.         Tipp<T> juur = paremAlluv;
  307.         Tipp<T> paremaVasak = paremAlluv.getVasakAlluv();
  308.  
  309.         juur.setVasakAlluv(this);
  310.         paremAlluv = paremaVasak;
  311.  
  312.         return juur;
  313.     }
  314.  
  315.     private Tipp<T> paremPoore() {
  316.         Tipp<T> juur = vasakAlluv;
  317.         Tipp<T> vasakuParem = vasakAlluv.getParemAlluv();
  318.  
  319.         juur.setParemAlluv(this);
  320.         vasakAlluv = vasakuParem;
  321.  
  322.         return juur;
  323.     }
  324.  
  325.     private Tipp<T> vasakParemPoore() {
  326.         this.vasakAlluv = vasakAlluv.vasakPoore();
  327.         return this.paremPoore();
  328.     }
  329.  
  330.     private Tipp<T> paremVasakPoore() {
  331.         this.paremAlluv = paremAlluv.paremPoore();
  332.         return this.vasakPoore();
  333.     }
  334.  
  335.     public Tipp<T> eemaldaTipp(Integer kirje) {
  336.         Tipp<T> leitudTipp = otsiKirje(this, kirje);
  337.         if (leitudTipp != null) {
  338.             return eemaldaTipp(leitudTipp);
  339.         }
  340.         return this;
  341.     }
  342.  
  343.  
  344.  
  345.     public String toString() {
  346.         return String.valueOf(info);
  347.     }
  348.    /* public String toString() {
  349.         List<List<String>> kulili = abiToString(new ArrayList<List<String>>(), 0); //leiab puu kuju külili pööratuna
  350.         int kõrgus = this.kõrgus();
  351.         for (List<String> kasitletav : kulili) { //lisatakse igale elemendile tühikuid juurde, et külili pikkus oleks kõigil sama pikk, mis kõrgus
  352.             while (kasitletav.size() < kõrgus) {
  353.                 kasitletav.add(" ");
  354.             }
  355.         }
  356.         StringBuilder kokku = new StringBuilder();
  357.         for (int i = 0; i < this.kõrgus() + 1; i++) { //Toimub külili kuju transponeerimine õigeks kujuks
  358.             StringBuilder a = new StringBuilder();
  359.             for (int j = 0; j < this.tippudeArv(); j++) {
  360.                 StringBuilder element = new StringBuilder(kulili.get(j).get(i));
  361.                 if (element.length() < String.valueOf(this.tippudeArv()).length()) //annab igale elemendile sama palju ruumi (tühikutena), et jaotuse välimus oleks ühtlane
  362.                     while (element.length() < String.valueOf(this.tippudeArv()).length()) {
  363.                         element.append(" ");
  364.                     }
  365.                 a.append(element);
  366.             }
  367.             kokku.append(a).append(System.lineSeparator());
  368.         }
  369.         return kokku.toString();
  370.     }
  371.  
  372.     private List<List<String>> abiToString(List<List<String>> jarjestus, int sugavus) {
  373.         if (vasakAlluv != null)
  374.             vasakAlluv.abiToString(jarjestus, sugavus + 1);
  375.         List<String> a = new ArrayList<>();
  376.         for (int i = 0; i < sugavus; i++) {
  377.             a.add(" ");
  378.         }
  379.         a.add(this.info.toString());
  380.         jarjestus.add(a);
  381.         if (paremAlluv != null)
  382.             paremAlluv.abiToString(jarjestus, sugavus + 1);
  383.         return jarjestus;
  384.     }
  385. */
  386.  
  387.  
  388.  
  389.     public String sulgEsitus() {
  390.         return sulgEsitusI(this);
  391.     }
  392.  
  393.     private static String sulgEsitusI(Tipp t) {
  394.         if (t == null) {
  395.             return "()";
  396.         }
  397.         return t.getInfo().toString()
  398.                 + "(" + sulgEsitusI(t.getVasakAlluv()) + sulgEsitusI(t.getParemAlluv()) + ")";
  399.     }
  400. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement