Πώς να συμπληρώσετε έναν πίνακα με στοιχεία κόμβο από ένα δυαδικό δένδρο αναζήτησης, σε αύξουσα σειρά;

ψήφοι
0

Σε μια σχολική εργασία είμαι υποτίθεται για να ολοκληρωθεί μια μέθοδο που θα πρέπει να επιστρέψει μια σειρά από στοιχεία κόμβου για ascendig. Οι κόμβοι συναρμολογούνται σε ένα δυαδικό δένδρο αναζήτησης, έτσι ώστε να τους ταξινομήσετε σωστά, πήρα μια άκρη για να δημιουργήσετε μια επαναληπτική μέθοδο για να κάνει τη δουλειά.

Το πρόβλημα είναι ότι αυτό δεν καν δώσει όλα τα στοιχεία στη συλλογή σύμφωνα με την έξοδο της δοκιμής (java.lang.AssertionError:. ToArray () δεν επιστρέφει όλα τα στοιχεία στη συλλογή)

Δεν θα μπορούσε να καταλήξει με οποιοδήποτε άλλο τρόπο για να ασχοληθεί με την σειρά, και δεν είμαι σίγουρος αν η αναδρομή λειτουργεί ακόμη. Κάθε βοήθεια είναι πολύ εκτίμησα. Παρακάτω είναι ο κωδικός μου:

public class BinarySearchTree<E extends Comparable<E>> implements
    IfiCollection<E> {

    Node root;
    Node current;
    int size = 0;
    int i = 0;

    public class Node {
    E obj;
    Node left, right;

    public Node(E e) {
        obj = e;
    }

    } // END class Node

    [...]

    public E[] toArray(E[] a) {

    Node n = root;

    a = sort(n, a);
    return a;

    }

    public E[] sort(Node n, E[] a) { //, int idx, E[] a) {

    if (n.left != null) {
        current = n.left;
        sort(current, a);
    }


    a[i] = current.obj;
    i++;

    if (n.right != null) {
        current = n.right;
        sort(current, a);
        }

    return a;

    } // END public Node sort

    [...]

} // END class BinarySearchTree

εξόδου Test:

java.lang.AssertionError: toArray () δεν επιστρέφει όλα τα στοιχεία στη συλλογή .: TestPerson ( Bender) compareTo (TestPerson ( Fry)) == 0 αναμενόμενο:. αλήθεια, αλλά ήταν: ψευδής σε inf1010.assignment .IfiCollectionTest.assertCompareToEquals (IfiCollectionTest.java:74) στους inf1010.assignment.IfiCollectionTest.assertCompareToEquals (IfiCollectionTest.java:83) στους inf1010.assignment.IfiCollectionTest.assertCompareToEqualsNoOrder (IfiCollectionTest.java:100) σε inf1010.assignment.IfiCollectionTest.toArray ( IfiCollectionTest.java:202)

protected void assertCompareToEquals(TestPerson actual,
        TestPerson expected, String msg) {
            assertTrue(actual.compareTo(expected) == 0, String.format( // l:74
            %s: %s.compareTo(%s) == 0, msg, actual, expected));
}

    [...]

protected void assertCompareToEquals(TestPerson[] actual,
        TestPerson[] expected, String msg) {
    for (int i = 0; i < actual.length; i++) {
        TestPerson a = actual[i];
        TestPerson e = expected[i];
        assertCompareToEquals(a, e, msg); // l:83
    }
}

    [...]

protected void assertCompareToEqualsNoOrder(TestPerson[] actual,
        TestPerson[] expected, String msg) {
    assertEquals(actual.length, expected.length, msg);

    TestPerson[] actualElements = new TestPerson[actual.length];
    System.arraycopy(actual, 0, actualElements, 0, actual.length);

    TestPerson[] expectedElements = new TestPerson[expected.length];
    System.arraycopy(expected, 0, expectedElements, 0, expected.length);

    Arrays.sort(expectedElements);
    Arrays.sort(actualElements);

    assertCompareToEquals(actualElements, expectedElements, msg); // l:100
}

    [...]

@Test(dependsOnGroups = { collection-core },
    description=Tests if method toArray yields all the elements inserted in the collection in sorted order with smallest item first.)
public void toArray() {
    TestPerson[] actualElements = c.toArray(new TestPerson[c.size()]);

    for (int i = 0; i < actualElements.length; i++) {
        assertNotNull(actualElements[i],
                toArray() - array element at index  + i +  is null);
    }

    TestPerson[] expectedElements = allElementsAsArray();
    assertCompareToEqualsNoOrder(actualElements, expectedElements, // l:202
            toArray() does not return all the elements in the collection.);

    Arrays.sort(expectedElements);
    assertCompareToEquals(actualElements, expectedElements,
            toArray() does not return the elements in sorted order with 
                    + the smallest elements first.);


    TestPerson[] inArr = new TestPerson[NAMES.length + 1];
    inArr[NAMES.length] = new TestPerson(TEMP);
    actualElements = c.toArray(inArr);
    assertNull(actualElements[NAMES.length],
            The the element in the array immediately following the 
            + end of the list is not set to null);
}

Δεν ξέρω αν θα πρέπει να δημοσιεύσει περισσότερες του κώδικα δοκιμής, είναι αρκετά εκτεταμένη, και θα μπορούσε να είναι λίγο πάρα πολύ για μία θέση;

Δημοσιεύθηκε 18/03/2011 στις 13:02
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
0

Νομίζω ότι όταν είστε σε σύγχυση είναι ότι εάν δείτε πώς μια δυαδική αναζήτηση έργα δέντρο, είναι ότι είναι πάντα ταξινομημένο. Μπορείτε να ξεκινήσετε στον κόμβο ρίζα σας, και στη συνέχεια, όπως μπορείτε να εισάγετε ένα νέο κόμβο, θα εισάγει στην κατάλληλη θέση (δηλαδή προς τα αριστερά ή προς τα δεξιά), ανάλογα με τις τιμές. Έτσι, δεν θα πρέπει να καλέσει το είδος για να αρχίσει με. Θα ήθελα λοιπόν να ξεκινήσουμε από εκεί, και να διαβάσετε επάνω σε δυαδικά δέντρα αναζήτησης. Για παράδειγμα wikipedia έχει ένα αξιοπρεπές άρθρο.

Ενημέρωση: Αγνοήστε το σχόλιό μου δεν θα χρειαστεί να το κάνουμε αυτό, είτε. Ας υποθέσουμε ότι εισάγετε 8, 3, 7, 9, 12, 2, 10, 1 μέσα στο δέντρο με αυτή τη σειρά. Θα πρέπει να καταλήγουν να μοιάζουν με αυτό:

      8
     / \
    3   9
   / \   \
  2   7   12
 /       /
1       10

Αν το δει κανείς αυτό σημαίνει να τους πάρει, ώστε, ξεκινούν από τη ρίζα, στη συνέχεια, αν έχει ένα κόμβο προς τα αριστερά πήρε προς τα αριστερά, αν όχι, το ίδιο επιστρέψει και να πάει προς τα δεξιά αν έχει αξία. Επαναλαμβάνοντας αυτό για κάθε κόμβο που αντιμετωπίζετε.

Απαντήθηκε 18/03/2011 στις 13:30
πηγή χρήστη

ψήφοι
1

Βλέπω έχετε τον κωδικό

if (n.left != null) {
        current = n.left;
        sort(current, a);
  }

αλλά δεν μπορώ να βρώ σε ποιο σημείο θα ορίσετε την τρέχουσα πίσω στο τρέχον κόμβο, έτσι ώστε όταν το κάνετε

a[i] = current.obj;

μπορείτε να πάρετε το σωστό αποτέλεσμα. Αυτός είναι πιθανώς γιατί δεν έχετε πάρει όλα τα αποτελέσματα. Σε κάθε περίπτωση, δεν βλέπω (τουλάχιστον από τον κωδικό θραύσματα που έχουν αναρτηθεί) γιατί τρέχουσες ανάγκες να είναι μια μεταβλητή κλάσης και όχι μόνο δηλώνονται στην μέθοδο ταξινόμησης. Σε γενικές γραμμές δεν θα πρέπει να χρησιμοποιούν μεταβλητές τάξη, αν δεν χρειάζεστε πραγματικά τους.

Επεξεργασία: Μπορείτε να ρυθμίσετε την τρέχουσα πίσω στον κόμβο που επεξεργάζονται μετά την κλήση του είδους στην αριστερή παιδί σαν αυτό

current = n;
a[i] = current.obj;
i++;

Ή να μην χρησιμοποιείτε την τρέχουσα καθόλου σε αυτή την περίπτωση θα είχατε κάτι σαν

if (n.left != null)
    sort(n.left, a);
a[i] = n.obj;
i++;
if (n.right != null)
    sort(n.right, a);
Απαντήθηκε 18/03/2011 στις 13:57
πηγή χρήστη

ψήφοι
0

http://cs.armstrong.edu/liang/intro8e/html/BinaryTree.html

Ο ευκολότερος τρόπος για να γίνει αυτό που ψάχνετε είναι να διασχίσει το δέντρο inorder και να προσθέσετε σε ένα ArrayList. Για να πάρετε τον πίνακα μπορείτε να καλέσετε τη μέθοδο .toArray () του ArrayList.

Εάν δεν μπορείτε να χρησιμοποιήσετε ένα ArrayList, δηλώνουν ένα δείκτη και μια σειρά έξω από την inordertraversal και αύξηση, θα πρέπει να ξέρετε πόσα στοιχεία είναι στο δέντρο για να δηλώσει σειρά σας.

ψευδοκώδικας:

variables:
arraysize = root.count()
E[] inOrderNodeArray = new E[arraysize]
int index = 0

inorder traversal:
void inorder(Node n) {
    if (n) {
        inorder(n.left)
        inOrderNodeArray[index] = n
        index++
        inorder(n.right)
    }
}
Απαντήθηκε 18/03/2011 στις 14:01
πηγή χρήστη

ψήφοι
1

Εντάξει, νομίζω ότι το πρόβλημα είναι η χρήση της «παγκόσμιας» μεταβλητή current. Ο τρόπος που έχει οριστεί, δεν έχει και πολύ νόημα. Δεν χρειάζεται να ούτως ή άλλως, επειδή η «τρέχουσα» Nodeείναι αυτή που παρέχεται στις παραμέτρους.

Επίσης, θα πρέπει να εξετάσει τη μετονομασία λειτουργία σας. Δεν έχετε διαλογή τίποτα εδώ, μόνο τη συλλογή των περιεχομένων του δέντρου, έτσι, ένα όνομα, όπως collectθα ήταν πιο κατάλληλο.

public E[] toArray(E[] a) {
  Node n = root;
  a = collect(n, a);
  return a;
}

public E[] collect(Node n, E[] a) {

  if (n.left != null) {
    // If there is a left (smaller) value, we go there first
    collect(n.left, a);
  }


  // Once we've got all left (smaller) values we can
  // collect the value of out current Node.
  a[i] = n.obj;
  i++;

  if (n.right != null) {
    // And if there is a right (larger) value we get it next
    collect(n.right, a);
  }

  return a;
}

(Προσοχή: δεν το έχω δοκιμάσει αυτό)


Εναλλακτικές εφαρμογή χωρίς τον παγκόσμιο δείκτη:

public E[] toArray(E[] a) {
  Node n = root;
  collect(n, a, 0);
  return a;
}

public int collect(Node n, E[] a, int i) {

  if (n.left != null) {
    // If there is a left (smaller) value, we go there first
    i = collect(n.left, a, i);
  }


  // Once we've got all left (smaller) values we can
  // collect the value of out current Node.
  a[i] = n.obj;
  i++;

  if (n.right != null) {
    // And if there is a right (larger) value we get it next
    i = collect(n.right, a, i);
  }

  return i;
}
Απαντήθηκε 18/03/2011 στις 14:07
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more