Løsningsforslag 10

Fra Hiofwiki

Gå til: navigasjon, søk

Innhold

Gruppe 118

Oppgavesett 10 Trær

Oppgave 10.1

         A
	/ \
       B   C
      / \   \
     /   \   \
    /     \   \
   D       E   F
  / \     / \   \
 G   H   I   J   K
        / \
       L   M

a) Hvilken node er rotnoden? A er rotnoden
b) Hvilke noder er blader i treet? G, H, L, M, J, K er bladene til treet
c) Hva er dybden til treet? Dybden er 5 (inkludert rotnoden)
d) Angi rekkefølgen som nodene oppsøkes i ved hhv. preorder, inorder, postorder og bredde-først traversering.

Preorder: A, B, D, G, H, E, I, L, M, J, C, F, K
Inorder: G, D, H, B, L, I, M, E, J, A, C, F, K
Postorder: G, H, D, L, M, I, J, E, B, K, F, C, A
Level-order: A, B, C, D, E, F, H, I, J, K, L, M


Oppgave 10.2

Angi, for hver node:

a) Foreldernoden
b) Barn
c) Søsken
d) Dybde (antall noder til dypeste bladnode, inkludert noden selv)
e) Størrelse (antall noder i subtreet med rot i denne nod

(lånt svaroppsett av Gruppe 4(Emil Krey), siden det var oversiktlig)

    A     B     C     D     E     F     G     H     I     J     K     L     M   
a)        A     A     B     B     C     D     D     E     E     F     I     I
b) B,C   D,E    F    G,H   I,J    K                L,M
c)        C     B     E     D           H     G     J     I           M     L
d)  5     4     3     2     3     2     1     1     2     1     1     1     1
e) 13     9     3     3     5     2     1     1     3     1     1     1     1


Oppgave 10.3

Hva skrives ut når følgende rekursive metode

public void mysteryPrint(BinaryNode t)
{
  if (t != null)
  {
    System.out.println(t.element);
    mysteryPrint(t.left);
    System.out.println(t.element);
    mysteryPrint(t.right);
    System.out.println(t.element);
  }
}

brukes på følgende binære tre?

         a
	/ \
       /   \
      b     c
       \   /
        d e

Vi antar at den kalles med en referanse til roten i dette treet, og at variabelen "element" i hver node inneholder et enkelt tegn som i figuren.

Svar: a, b, b, d, d, d, b, a, c, e, e, e, c, c, a

Oppgave 10.4 && 10.5

/**
 *
 * @author Lars Emil
 */
public class TreNode {
    int data;
    TreNode venstre, hoeyre;
    
    public TreNode(int n)
    {
      data = n;
      venstre = hoeyre = null;
    }

    public int antallBlader(TreNode rot)
    {
        // Returnerer antall blader i et tre med en gitt rot
        int antall = 0;
        if(rot.venstre == null && rot.hoeyre == null) 
            antall++;
        else
        {
            if(rot.venstre != null)
                antall += antallBlader(rot.venstre);
            if(rot.hoeyre != null)
                antall += antallBlader(rot.hoeyre);
        }
        return antall;
    }

   public int antallMedEttBarn(TreNode rot)
   {
        // Returnerer antall noder med bare ett barn
        // i et tre med en gitt rot
       int antall = 0;
       if(rot.venstre == null && rot.hoeyre != null)
       {
           antall++;
           antall += antallMedEttBarn(rot.hoeyre);
       }
       else if(rot.venstre != null && rot.hoeyre == null)
       {
           antall++;
           antall += antallMedEttBarn(rot.venstre);
       }
       else if(rot.venstre != null && rot.hoeyre != null)
       {
            antall += antallMedEttBarn(rot.hoeyre);
           antall += antallMedEttBarn(rot.venstre);
       }
       return antall;
   }

   public int antallMedToBarn(TreNode rot)
   {
        // Returnerer antall noder med to barn (fulle noder)
        // i et tre med en gitt rot
       int antall = 0;
       if(rot.venstre == null && rot.hoeyre != null)
       {
           antall += antallMedToBarn(rot.hoeyre);
       }
       else if(rot.venstre != null && rot.hoeyre == null)
       {
           antall += antallMedToBarn(rot.venstre);
       }
       else if(rot.venstre != null && rot.hoeyre != null)
       {
           antall ++;
           antall += antallMedToBarn(rot.hoeyre);
           antall += antallMedToBarn(rot.venstre);
       }
       return antall;
   }

   public int finnVerdi(TreNode rot, int verdi)
   {
       int help = 0;
       if(rot.data == verdi)
           help = rot.data;
       else
       {
            if(rot.venstre != null)
                help += finnVerdi(rot.venstre, verdi);
            if(help == 0 && rot.hoeyre != null)
                help += finnVerdi(rot.hoeyre, verdi);
       }
       return help;
   }
}
/**
 *
 * @author Lars Emil
 */
public class TreNodeTest
{

    public static void main(String[] args)
    {
        /*          2
         *         / \
         *        1   3
         *           / \
         *          5   4
         *         /     \
         *        6       7
         */
        TreNode t1 = new TreNode(1);
        TreNode t2 = new TreNode(2);
        TreNode t3 = new TreNode(3);
        TreNode t4 = new TreNode(4);
        TreNode t5 = new TreNode(5);
        TreNode t6 = new TreNode(6);
        TreNode t7 = new TreNode(7);
        
        t2.venstre = t1;
        t2.hoeyre = t3;
        t3.venstre = t5;
        t3.hoeyre = t4;
        t4.hoeyre = t7;
        t5.venstre = t6;
        
        System.out.println("Antall blader: " + t2.antallBlader(t2));
        System.out.println("Antall Med Ett Barn: " + t2.antallMedEttBarn(t2));
        System.out.println("Antall Med To Barn: " + t2.antallMedToBarn(t2));
        System.out.println("Finn verdi: " + t2.finnVerdi(t2, 8));              
    }
}