C4

package sk.upjs.cvicenie03;

import java.io.File;
import java.util.*;

public class Osoba {
        /**
         * Meno osoby
         */

        private String meno;
        /**
         * Zoznam deti osoby
         */

        private List<Osoba> deti = new ArrayList<Osoba>();

        /**
         * Konstruktor osoby v strome potomkov
         *
         * @param meno meno osoby
         */

        public Osoba(String meno) {
                this.meno = meno;
        }

        /**
         * Prida osobe dieta
         *
         * @param dieta referencia na pridavane dieta
         */

        public void pridajDieta(Osoba dieta) {
                deti.add(dieta);
        }

        /**
         * Vrati celkovy pocet potomkov osoby
         */

        public int pocetPotomkov() {
                int pocetPotomkovDeti = 0;
                for (Osoba dieta : deti)
                        pocetPotomkovDeti += dieta.pocetPotomkov();

                return pocetPotomkovDeti + deti.size();
        }

        /**
         * Vypise rodostrom osoby
         */

        public void vypisRodostrom() {
                System.out.println(meno);
                for (Osoba dieta : deti)
                        dieta.vypisRodostrom();
        }

        public int pocetGeneracii() {
                if (deti.size() == 0) {
                        return 0;
                }
                int maxPocetGeneracii = 0;
                for (Osoba dieta : deti) {
                        if (dieta.pocetGeneracii() > maxPocetGeneracii) {
                                maxPocetGeneracii = dieta.pocetGeneracii();
                        }
                }
                return maxPocetGeneracii + 1;
        }

        public void pridajDoZoznamu(List<Osoba> zoznam) {
                zoznam.addAll(this.deti);

                for (Osoba dieta : deti) {
                        dieta.pridajDoZoznamu(zoznam);
                }
        }

        public static long velkostSuborov(File adresar) {
                long velkost = 0;

                File[] obsahAdresara = adresar.listFiles();
                for (int i = 0; i < obsahAdresara.length; i++) {
                        if (obsahAdresara[i].isDirectory()) {
                                // je to adresar
                                velkost += velkostSuborov(obsahAdresara[i]);
                        } else {
                                // je to subor
                                velkost += obsahAdresara[i].length();
                        }
                }

                return velkost;
        }

        /**
         * Main s vytvorenim stromu potomkov pre Janka
         */

        public static void main(String[] args) {
                Osoba janko = new Osoba("Janko");
                Osoba jozko = new Osoba("Jozko");
                Osoba maria = new Osoba("Maria");
                Osoba karol = new Osoba("Karol");
                Osoba lucia = new Osoba("Lucia");
                Osoba petra = new Osoba("Petra");
                janko.pridajDieta(jozko);
                janko.pridajDieta(maria);
                janko.pridajDieta(karol);
                karol.pridajDieta(lucia);
                karol.pridajDieta(petra);
                // janko.vypisRodostrom();
        }
}
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();

        }

}