// TRAI_23_t14_15.java.java SJ
/**
* 14. Kirjoita algoritmi joka laskee annetun binääripuun korkeuden, ts. pisimmän polun juuresta
* lehtisolmuun. Aikavaativuus? Vihje: rekursio.
*
* 15. Kirjoita algoritmi joka lisää sisäjärjestyksessä olevaan binääripuuhun uuden solmun siten,
* että puu säilyy sisäjärjestyksessä. Jos sama alkio (.equals()) oli jo puussa, niin alkiota ei
* lisätä puuhun. Parametreina puu ja alkio. Algoritmi luo uuden solmun jos lisäys tehdään.
* Algoritmi palauttaa totuusarvon lisättiinkö alkio vai ei. Algoritmin toiminta käydään
* läpi luennolla. Aikavaativuus?
*/
// Tarvitset projektiin (tai komentoriville) TRA-kirjaston Moodlesta.
import fi.uef.cs.tra.BTree;
import fi.uef.cs.tra.BTreeNode;
import java.util.Random;
public class TRAI_23_t14_15_esim {
public static void main(String[] args) {
BTree puu = new BTree<>();
int N = 12;
if (args.length > 0)
N = Integer.parseInt(args[0]);
// testataan ensin vakiopuulla
puu = exampleBTree();
System.out.println("Sisäjärjestyksessä:");
inorderPrint(puu);
System.out.println("Korkeus = " + korkeus(puu));
System.out.println();
// tehdään vielä uusi generoitu ja testataan samalla
// tehtävää 15
puu = new BTree<>();
System.out.println("\nPuuhun:");
Random r = new Random(42);
Integer x = null;
for (int i = 0; i < N; i++) {
x = r.nextInt(N * 2);
System.out.print(x + " ");
inorderInsert(puu, x);
}
System.out.println();
System.out.println("Sisäjärjestyksessä:");
inorderPrint(puu);
System.out.println("Korkeus = " + korkeus(puu));
// testataan vielä hakemista
for (int i = 0; i < N * 2; i++) {
System.out.println("Onko " + i + " : " +
inorderMember(puu, i));
}
} // main()
/**
* 14. Puun korkeus. Käynnistysmetodi
* @param t tarkasteltava binääripuu.
* @return puun korkeus tai -1 jos puu on tyhjä
**/
public static int korkeus(BTree t) {
return korkeus(t.getRoot());
}
/**
* Solmun korkeus.
* @param n tarkasteltava solmu
* @return solmun korkeus, tai -1 jos n==null
*/
public static int korkeus(BTreeNode n) {
// null:n "korkeus" on -1 jotta lehtisolmun korkeus
// on max(-1,-1)+1 = 0
if (n == null)
return -1;
// solmun korkeus on maksimi lasten korkeuksista + 1
return Math.max(korkeus(n.getLeftChild()),
korkeus(n.getRightChild())) + 1;
}
/**
* 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 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
n = n.getLeftChild();
} else {
// x suurempi kuin n
if (n.getRightChild() == null) {
// lisäyskohta läydetty
n.setRightChild(new BTreeNode<>(x));
return true;
} else
n = n.getRightChild();
}
} // while
} // inorderInsert()
// -------------------------------
// esimerkkejä
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(3));
l.setRightChild(new BTreeNode(8));
l.getLeftChild().setRightChild(new BTreeNode(4));
// 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));
System.out.println(" ");
System.out.println(" 9 ");
System.out.println(" __/ \\__ ");
System.out.println(" 5 15 ");
System.out.println(" / \\ / \\ ");
System.out.println(" 3 8 12 18");
System.out.println(" \\ /\\ ");
System.out.println(" 4 11 13 ");
System.out.println(" ");
return T;
} // exampleBTree()
/**
* Onko alkio sisäjärjestetyssä binääripuussa vai ei
* @param T sisäjärjestetty binääripuu
* @param x etsittävä alkio
* @param alkiotyyppi
* @return true jos alkio x on puussa, muuten false
*/
public static >
boolean inorderMember(BTree T, E x) {
BTreeNode n = T.getRoot();
while (n != null) {
if (x.compareTo(n.getElement()) == 0)
return true;
else if (x.compareTo(n.getElement()) < 0)
n = n.getLeftChild();
else
n = n.getRightChild();
} // while
return false;
} // inorderMember()
/**
* Tulostus sisäjärjestyksessä rekursiivisesti.
* @param T tulostettava puu
*/
public static void inorderPrint(BTree T) {
inorderPrintBranch(T.getRoot());
System.out.println();
} // inorderPrint()
/**
* Tulostus sisäjärjestyksessä rekursiivisesti.
* @param n tulostettavan alipuun juuri
*/
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_t14_15.java