package sk.upjs.cvicenie03;
public class Uzol {
private int hodnota;
private Uzol lavy;
private Uzol pravy;
public Uzol(int hodnota, Uzol lavy, Uzol pravy) {
super();
this.hodnota = hodnota;
this.lavy = lavy;
this.pravy = pravy;
}
private static int najdiZacIdxKorena(String opisStromu) {
if (opisStromu.charAt(0) != '(') {
return 0;
}
int pocetZatvoriek = 0;
for (int i = 0; i < opisStromu.length(); i++) {
if (opisStromu.charAt(i) == '(') {
pocetZatvoriek++;
}
if (opisStromu.charAt(i) == ')') {
pocetZatvoriek--;
}
if (pocetZatvoriek == 0) {
return i + 1;
}
}
return -1;
}
public static Uzol stromZRetazca(String opisStromu) {
// vyriesim medzery
opisStromu = opisStromu.replaceAll(" ", "");
System.out.println(opisStromu);
// najdeme koren
// najdem zaciatok korena
int idxZacKor = najdiZacIdxKorena(opisStromu);
int idxKonKor = opisStromu.indexOf('(', idxZacKor);
System.out.println("idxZacKor " + idxZacKor);
System.out.println("idxKonKor " + idxKonKor);
String korenRetazec;
if (idxKonKor == -1) {
korenRetazec = opisStromu.substring(idxZacKor);
} else {
korenRetazec = opisStromu.substring(idxZacKor, idxKonKor);
}
System.out.println("koren je: " + korenRetazec);
int hodnotaKorena = Integer.parseInt(korenRetazec);
// na zaklade korena rozdelim retazec na lavy a pravy
Uzol lavyUzol;
if (idxZacKor == 0) {
System.out.println("lavy: " + "");
lavyUzol = null;
} else {
String lavy = opisStromu.substring(1, idxZacKor - 1);
System.out.println("lavy: " + lavy);
lavyUzol = stromZRetazca(lavy);
}
Uzol pravyUzol;
if (idxKonKor == -1) {
// System.out.println("pravy: " + "");
pravyUzol = null;
} else {
String pravy = opisStromu.substring(idxKonKor + 1, opisStromu.length() - 1);
// System.out.println("pravy: " + pravy);
pravyUzol = stromZRetazca(pravy);
}
// pouzijem tu istu metodu pre labvy a pravy podretazec
// toto sme spravili pri sekani zo stringu opisStromu
// zrekonstruujem strom
Uzol ja = new Uzol(hodnotaKorena, lavyUzol, pravyUzol);
return ja;
}
@Override
public String toString() {
return "(" + lavy + ")" + hodnota + "(" + pravy + ")";
}
public void vypis() {
if (lavy != null) {
lavy.vypis();
}
System.out.println(hodnota);
if (pravy != null) {
pravy.vypis();
}
}
public static void main(String[] args) {
String opisStromu = "((3) 7 ((978) 6 (11))) 2 (5 ((4) 9)) ";
Uzol u = stromZRetazca(opisStromu);
u.vypis();
}
}