package sk.upjs.paz.cvicenie04;
/**
* Trieda reprezentujuca uzol binarneho stromu
*/
public class Uzol {
/**
* Hodnota ulozena v uzle stromu
*/
private int hodnota;
/**
* Referencia na laveho syna uzla (koren laveho podstromu)
*/
private Uzol lavy;
/**
* Referencia na praveho syna uzla (koren praveho podstromu)
*/
private Uzol pravy;
/**
* Konstruktor uzla binarneho stromu
*
* @param hodnota
* @param lavy
* @param pravy
*/
public Uzol(int hodnota, Uzol lavy, Uzol pravy) {
this.hodnota = hodnota;
this.lavy = lavy;
this.pravy = pravy;
}
/**
* Vypise obsah uzlov stromu, ktoreho korenom je tento vrchol. Realizuje preorder prechod.
*/
public void vypis() {
// Vypiseme hodnotu
System.out.println(hodnota);
// Ak je lavy syn, poziadame ho o vypis hodnot laveho podstromu
if (lavy != null)
lavy.vypis();
// Ak je pravy syn, poziadame ho o vypis hodnot praveho podstromu
if (pravy != null)
pravy.vypis();
}
/**
* Vrati maximum v strome, ktoreho je tento uzol korenom
*/
public int maximum() {
// Predpokladame, ze maximum je hodnota v tomto uzle
int vysledok = hodnota;
// Ak je lavy syn, vyberieme bud maximum z laveho podstromu
// alebo hodnotu v tomto uzle - podla toho, co je vacsie
if (lavy != null)
vysledok = Math.max(vysledok, lavy.maximum());
// Ak je pravy syn, skusime, ci maximum v pravom podstrome nie je
// vacsie
if (pravy != null)
vysledok = Math.max(vysledok, pravy.maximum());
return vysledok;
}
/**
* Zisti, ci sa zadana hodnota nachadza v strome, ktoreho je tento uzol korenom
*
* @param hladany hladana hodnota
*/
public boolean obsahuje(int hladany) {
// Ak je hladana hodnota v tomto uzle, koncime ihned
if (hodnota == hladany)
return true;
// Ak je lavy syn, skusime, ci hladana hodnota nie je v podstrome,
// ktoreho je lavy syn korenom
if (lavy != null)
if (lavy.obsahuje(hladany))
return true;
// Ak je pravy syn, skusime, ci hladana hodnota nie je v podstrome,
// ktoreho je pravy syn korenom
if (pravy != null)
if (pravy.obsahuje(hladany))
return true;
return false;
}
public int getHodnota() {
return hodnota;
}
public void setHodnota(int hodnota) {
this.hodnota = hodnota;
}
private static int indexKorena(String opisStromu) {
if (opisStromu.charAt(0) != '(') {
return 0;
}
int pocitadlo = 0;
for (int i = 0; i < opisStromu.length(); i++) {
if (opisStromu.charAt(i) == '(') {
pocitadlo++;
} else if (opisStromu.charAt(i) == ')') {
pocitadlo--;
}
if (pocitadlo == 0) {
return i + 1;
}
}
return 0;
}
private static String odstranitMedzery(String s) {
// StringBuilder sb = new StringBuilder();
// for (int i = 0; i < s.length(); i++) {
// if (s.charAt(i) != ' ') {
// sb.append(s.charAt(i));
// }
// }
// return sb.toString();
return s.replaceAll(" ", "");
}
// ((2) 7 ((5) 6 (11))) 2 (5 ((4) 9))
public static Uzol stromZRetazca(String opisStromu) {
opisStromu = odstranitMedzery(opisStromu);
// 1. najst index korena
int indexKorena = indexKorena(opisStromu);
// 2. vytvorim uzol
// uzol.hodnota - precitat zo stringu od indexu korena
int indexZatvorkyZaKorenom = opisStromu.indexOf('(', indexKorena);
if (indexZatvorkyZaKorenom == -1) {
indexZatvorkyZaKorenom = opisStromu.length();
}
String koren = opisStromu.substring(indexKorena, indexZatvorkyZaKorenom);
System.out.println("Koren je: \"" + koren+ "\"");
int hodnota = Integer.parseInt(koren);
//zapis v jednom riadku - int hodnota = Integer.parseInt(opisStromu.substring(indexKorena, opisStromu.indexOf('(', indexKorena)));
// uzol.lavy - stromZRetazca(opisStromu.substring(vlavo))
Uzol lavy = null;
// podmienka moze byt aj ina, napr. indexKorena != 0
if (opisStromu.charAt(0) == '(') {
lavy = stromZRetazca(opisStromu.substring(1, indexKorena - 1));
}
// uzol.pravy - stromZRetazca(substring vpravo)
Uzol pravy = null;
if (opisStromu.charAt(opisStromu.length() - 1) == ')') {
pravy = stromZRetazca(opisStromu.substring(indexZatvorkyZaKorenom + 1, opisStromu.length() - 1));
}
// nezabudnut
// pri substringoch vynechat krajne zatvorky
// vyriesit listy pripadne uzol.lavy=null
// 3. vratim uzol
return new Uzol(hodnota, lavy, pravy);
}
public static void main(String[] args) {
// Uzol koren = new Uzol(5, new Uzol(2, new Uzol(8, null, null), null), new Uzol(9, null, null));
// koren.vypis();
// System.out.println("Maximum je " + koren.maximum());
String s = "((2) 7 ((5) 6 (11))) 2 (5 ((4) 9))";
Uzol u = stromZRetazca(s);
System.out.println();
}
}