Avatar billede fastpoint Nybegynder
25. maj 2005 - 11:03 Der er 12 kommentarer og
1 løsning

Hjælp til træer

Vi har fået nogle øvelser til følgende emne. Jeg ønsker blot en løsning til spørgsmålet så kan jeg selv løse resten af spørgsmålene har bare ingen erfaring med træer på nuværende tidspunkt andet end, at vi har fået denne kode udleveret. Har dog læst kapitlet, som omhandler dem.

Det er kun øvelser og ikke eksamensrelateret

Spørgsmålet

Det forventes at der udvides med en levelOrder traversering i Iteratoren. Denne illustreres anvendt ved en udskrift af eksempeltræet. Udkriften behøves ikke foregå i GUI/SWING men kan sagtens være konsolbaseret. LevelOrder tilføjes i IteratorKlassen.

Iterator koden er

package mypackage;

public class TreeIterator implements java.util.Iterator {
  private BinaryTreeBasis binTree;
  private TreeNode currentNode;
  private QueueInterface queue; // from Chapter 7

  public TreeIterator(BinaryTreeBasis bTree) {
    binTree = bTree;
    currentNode = null;
    // empty queue indicates no traversal type currently
    // selected or end of current traversal has been reached
    queue = new QueueReferenceBased();
  }  // end constructor

  public boolean hasNext() {
    return !queue.isEmpty();
  }  // end hasNext

  public Object next()
                throws java.util.NoSuchElementException {
    try {
      currentNode = (TreeNode)queue.dequeue();
      return currentNode.getItem();
    }  // end try
    catch (QueueException e) {
      throw new java.util.NoSuchElementException();
    }  // end catch
  }  // end next

  public void remove()
              throws UnsupportedOperationException {
    throw new UnsupportedOperationException();
  }  // end remove

  public void setPreorder() {
    queue.dequeueAll();
    preorder(binTree.root);
  }  // setPreOrder

  public void setInorder() {
    queue.dequeueAll();
    inorder(binTree.root);
  }  // end setInorder

  public void setPostorder() {
    queue.dequeueAll();
    postorder(binTree.root);
  }  // end setPostorder

  private void preorder(TreeNode treeNode) {
    if (treeNode != null) { 
      queue.enqueue(treeNode);
      preorder(treeNode.getLeft());
      preorder(treeNode.getRight());
    } // end if
  }  // end preorder

  private void inorder(TreeNode treeNode) {
    if (treeNode != null) { 
      inorder(treeNode.getLeft());
      queue.enqueue(treeNode);
      inorder(treeNode.getRight());
    } // end if
  }  // end inorder

  private void postorder(TreeNode treeNode) {
    if (treeNode != null) { 
      postorder(treeNode.getLeft());
      postorder(treeNode.getRight());
      queue.enqueue(treeNode);
    } // end if
  }  // end postorder
}  // end TreeIterator
Avatar billede fastpoint Nybegynder
25. maj 2005 - 11:12 #1
Er opgaven for svær så vil fingerpeg i den rigtige retning måske også være nok
Avatar billede fastpoint Nybegynder
25. maj 2005 - 11:24 #2
Kan nogen forklare spørgsmålet?
Avatar billede fastpoint Nybegynder
25. maj 2005 - 12:15 #3
okay jeg har forstået hvad vi skal lave nu.
Vi skal printe alt ud på niveau 1 først, så niveau 2 og så niveau 3 osv.

nogen hjælp at hente?
Avatar billede jakoba Nybegynder
25. maj 2005 - 23:09 #4
Du skal bruge en rekursion der udskriver "alle n levels under mig" eller "mig hvis n==0".

dun rekursion må også meget gerne returnere "er der et level endnu længere nede" som boolean.

så det bliver 2 funktioner:
en rekursiv  til at skrive eet enkelt level
    public boolean skrivLevel( int LevelUnder ) {
        if ( LevelUnder == 0 ) {
            // skriv denne
            return ( this.rightNode != null || this.leftNode != null );
        } else {
            boolean tempResultat = false
            if ( this.rightNode != null ) {
                tempResultat = tempResultat || this.rightNode.skrivLevel(LevelUnder-1);
            }
            if ( this.leftNode != null ) {
                tempResultat = tempResultat || this.leftNode.skrivLevel(LevelUnder-1);
            }
            return tempResultat;
        }
    } //endmethod

en iterativ til at vælge levels der skal skrives, fra 0 til yderste blad
    public void skrivAlleLevels() {    // nb: iterativ og ikke rekursiv
        int i = 0;
        while ( this.skrivLevel( i ) ) {
            i++;
        }
    } //endmethod.
Avatar billede jakoba Nybegynder
25. maj 2005 - 23:16 #5
Ups, der kvajede jeg mig.

det skal være
            if ( this.rightNode != null ) {
                tempResultat = this.rightNode.skrivLevel(LevelUnder-1) || tempResultat;
                    // operander ombyttet så vi er sikre på skrivLevel bliver kaldt
            }
            if ( this.leftNode != null ) {
                tempResultat = this.leftNode.skrivLevel(LevelUnder-1) || tempResultat;
                    // operander ombyttet så vi er sikre på skrivLevel bliver kaldt
            }
Avatar billede fastpoint Nybegynder
26. maj 2005 - 13:21 #6
Skal metoderne placeres i TreeNode klassen eller i iterator klassen?
Jeg prøver i mellemtiden begge dele:)
Avatar billede fastpoint Nybegynder
26. maj 2005 - 13:25 #7
Her er TreeNode klassen


package mypackage;

public class TreeNode {
  private Object item;
  private TreeNode leftChild;
  private TreeNode rightChild;

  public TreeNode(Object newItem) {
  // Initializes tree node with item and no children.
    item = newItem;
    leftChild  = null;
    rightChild = null;
  }  // end constructor
   
  public TreeNode(Object newItem,
                  TreeNode left, TreeNode right) {
  // Initializes tree node with item and
  // the left and right children references.
    item = newItem;
    leftChild  = left;
    rightChild = right;
  }  // end constructor

  public Object getItem() {
  // Returns the item field.
    return item;
  }  // end getItem

  public void setItem(Object newItem) {
  // Sets the item field to the new value newItem.
  item  = newItem;
  }  // end setItem

  public TreeNode getLeft() {
  // Returns the reference to the left child.
    return leftChild;
  }  // end getLeft

  public void setLeft(TreeNode left) {
  // Sets the left child reference to left.
    leftChild  = left;
  }  // end setLeft

  public TreeNode getRight() {
  // Returns the reference to the right child.
    return rightChild;
  }  // end getRight

  public void setRight(TreeNode right) {
  // Sets the right child reference to right.
    rightChild  = right;
  }  // end setRight
 

 
}  // end TreeNode
Avatar billede fastpoint Nybegynder
26. maj 2005 - 13:31 #8
Hvis træet ser ud som denne

Root
venstrebarn - højrebarn
børn til venstrebarn - børn til højrebarn

så skal den først udskrive

Root
venstrebarn - højrebarn
børn til venstrebarn - børn til højrebarn

Træet er på 3 niveauer
Avatar billede fastpoint Nybegynder
26. maj 2005 - 13:50 #9
Det ser ud til du vil have koden i TreeNode, men den skulle gerne være i iteratoren.
Der anvender vi queue. Nogle ideer til hvordan det kan klares?
Avatar billede jakoba Nybegynder
26. maj 2005 - 18:25 #10
jeg ville nok beholde den code i treeNode, men istedet for at udskrive skulle den så lægges nodes i en arraylist som du så kan iterere på.

Men hvis du henter nodes via en iterator hvordan vil du så holde rede i hvor hvert level ender?
Avatar billede fastpoint Nybegynder
27. maj 2005 - 09:15 #11
ud fra eksemplet før

Root
venstrebarn - højrebarn
børn til venstrebarn - børn til højrebarn

queue Root
queue venstrebarn - højrebarn
queue børn til venstrebarn - børn til højrebarn

og så printe køen ud?
Avatar billede fastpoint Nybegynder
12. september 2005 - 15:25 #12
jakoba lig et svar.
Avatar billede jakoba Nybegynder
12. september 2005 - 15:49 #13
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester