Løsningsforslag - oppgaver i Avsnitt 9.1.4


Oppgave 1

  private static <T> Node<T> dobbelHøyreRotasjon(Node<T> p)
  {
    Node<T> q = p.venstre;
    Node<T> r  = q.høyre;

    q.høyre = r.venstre;
    r.venstre = q;

    p.venstre = r.høyre;
    r.høyre = p;

    return r;
  }

Oppgave 4

  private static <T> void tilTabell(Node<T> p, Node<T>[] a, int[] indeks)
  {
    if (p.venstre != null) tilTabell(p.venstre,a,indeks);
    a[indeks[0]] = p;
    indeks[0]++;
    if (p.høyre != null) tilTabell(p.høyre,a,indeks);
  }

Oppgave 5

  private static <T> Node<T> komplett(Node<T>[] a, int v, int h)
  {
    if (v > h) return null;             // tomt intervall

    int n = h - v + 1;                  // antallet i intervallet
    int k = Integer.highestOneBit(n);   // stripper n

    int m = n - (k >> 1);               // k >> 1 svarer til k/2
    m = (m < k ? m : k - 1) + v;        // m relativt til v

    a[m].venstre = komplett(a, v, m - 1);   // venstre subtre
    a[m].høyre   = komplett(a, m + 1, h);   // høyre subtre

    return a[m];
  }

Oppgave 6

  public void gjørKomplett()
  {
    Node[] a = new Node[antall];
    int[] indeks = {0};
    tilTabell(rot,a,indeks);
    for (int i = 0; i < a.length; i++) a[i].venstre = a[i].høyre = null;
    rot = komplett(a,0,antall-1);
  }