// TRAI_23_t16_18.java.java SJ /** * 16. Kirjoita algoritmi joka etsii binääripuun vähiten syvän (lähimpänä juurta olevan) leh- * tisolmun. Vihje: tasoittainen läpikäynti. Aikavaativuus? * * 17. Kirjoita algoritmi, joka vertaa kahta binääripuuta ja palauttaa toden jos puut ovat raken- * teeltaan samat, muuten epätoden. Puut ovat rakenteeltaan samat, jos juuren molemmat * alipuut ovat keskenään rakenteeltaan samanlaiset. Puun sisältämiä alkioita ei siis vertailla, * vain puun rakennetta (”oksaston muotoa”). Aikavaativuus? Tilavaativuus? Vihje: rekursio * rinta rinnan molemmissa puissa. * * 18. Kirjoita algoritmi joka laskee annetun binääripuun eri solmujen suurimman lasten kor- * keuseron. Algoritmi siis selvittää mille binääripuun solmulle oikean ja vasemman alipuun * korkeusero on suurin ja palauttaa ko. korkeuseron. Algoritmia voisi käyttää AVL-puun * tasapainon tarkastamiseen, mutta muistetaan, ettei AVL-puun toteutus tarvise tälläis- * ta tarkastamista. Mikä on algoritmisi aikavaativuus? Aikavaativuus vaikuttaa hieman * tehtävän arvosteluun. */ import fi.uef.cs.tra.BTree; import fi.uef.cs.tra.BTreeNode; import java.util.ArrayDeque; import java.util.Queue; import java.util.concurrent.atomic.AtomicInteger; public class TRAI_23_t16_18_pohja { public static void main(String[] args) { BTree puu = null; // testataan ensin vakiopuulla puu = exampleBTree(); System.out.println("Sisäjärjestyksessä:"); inorderPrint(puu); System.out.println("Matalin lehtisolmu: " + matalinLehtisolmu(puu)); int ero = suurinEro(puu); System.out.println("Suurin ero on " + ero); BTree puu2 = exampleBTree(); System.out.println("Samat rakenteet : " + vertaaRakenne(puu, puu2)); System.out.println("\nLisätään: 8"); inorderInsert(puu, 8); System.out.println("Samat rakenteet : " + vertaaRakenne(puu, puu2)); System.out.println("Matalin lehtisolmu: " + matalinLehtisolmu(puu)); ero = suurinEro(puu); System.out.println("Suurin ero on " + ero); System.out.println("\nLisätään: 3"); inorderInsert(puu, 3); System.out.println("Matalin lehtisolmu: " + matalinLehtisolmu(puu)); ero = suurinEro(puu); System.out.println("Suurin ero on " + ero); System.out.println(); } // main() /** * Puun matalin lehtisolmu. * @param T syötepuu * @return matalin lehtisolmu * @param puun solmujen alkioiden tyyppi */ public static BTreeNode matalinLehtisolmu(BTree T) { if (T.getRoot() == null) return null; // TODO return null; } // matalinLehtisolmu() /** * Puiden rakenteiden vertailu. * @param T1 syötepuu1 * @param T2 syötepuu2 * @param alkiotyyppi (ei käytetä) * @return ovatko rakenteeltaan samat vai ei */ public static boolean vertaaRakenne(BTree T1, BTree T2) { // TODO return false; } // vertaaRakenne() /** * Suurin puun solmujen tasapainoero. Siis solmujen lasten korkeusero. * @param T tarkasteltava binääripuu. * @return suurin korkeusaro puussa olevien solmujen lapsille **/ public static int suurinEro(BTree T) { // TODO return 0; } // esimerkkejä ja pohjia public static BTree exampleBTree() { BTree T = new BTree(); // juuri T.setRoot(new BTreeNode(9)); BTreeNode n = T.getRoot(); // juuren lapset n.setLeftChild(new BTreeNode(5)); n.setRightChild(new BTreeNode(15)); // vasen haara BTreeNode l = n.getLeftChild(); l.setLeftChild(new BTreeNode(1)); l.setRightChild(new BTreeNode(7)); l.getLeftChild().setRightChild(new BTreeNode(2)); // oikea haara l = n.getRightChild(); l.setLeftChild(new BTreeNode(12)); l.setRightChild(new BTreeNode(18)); l.getLeftChild().setLeftChild(new BTreeNode(11)); l.getLeftChild().setRightChild(new BTreeNode(13)); l.getRightChild().setLeftChild(new BTreeNode(17)); System.out.println(" "); System.out.println(" 9 "); System.out.println(" __/ \\__ "); System.out.println(" 5 15 "); System.out.println(" / \\ / \\ "); System.out.println(" 1 7 12 18"); System.out.println(" \\ /\\ / "); System.out.println(" 2 11 13 17 "); System.out.println(" "); return T; } // exampleBTree() /** * 15. Lisäys sisäjärjestettyyn binääripuuhun. * @param T binääripuu * @param x lisättävä alkio * @return tehtiinkö lisäys vai ei */ public static > boolean inorderInsert(BTree T, E x) { BTreeNode n = T.getRoot(); if (n == null) { T.setRoot(new BTreeNode(x)); return true; } while (true) { if (x.compareTo(n.getElement()) == 0) // x on jo puussa, eli lisätä return false; else if (x.compareTo(n.getElement()) < 0) { // x edeltää n:n alkiota if (n.getLeftChild() == null) { // lisäyskohta läydetty n.setLeftChild(new BTreeNode<>(x)); return true; } else // alas vasemmalle n = n.getLeftChild(); } else { // x suurempi kuin n if (n.getRightChild() == null) { // lisäyskohta läydetty n.setRightChild(new BTreeNode<>(x)); return true; } else // alas oikealle n = n.getRightChild(); } } // while } // inorderInsert() // Tulostus sisäjärjestyksessä rekursiivisesti public static void inorderPrint(BTree T) { inorderPrintBranch(T.getRoot()); System.out.println(); } // inorderPrint() public static void inorderPrintBranch(BTreeNode n) { if (n == null) return; inorderPrintBranch(n.getLeftChild()); System.out.print(n.getElement() + " "); inorderPrintBranch(n.getRightChild()); } // inorderPrintBranch() } // class TRAI_23_t16_18.java