Cum se umple o matrice cu elemente nod dintr-un arbore binar de căutare, în ordine crescătoare?

voturi
0

Într-o misiune de școală eu ar trebui să completeze o metodă care ar trebui să returneze o serie de elemente de nod în ordine ascendig. Nodurile sunt asamblate într-un arbore binar de căutare, astfel încât să le sorteze corect, am primit un sfat pentru a crea o metodă recursiv pentru a face treaba.

Problema este că acest lucru nu chiar randament toate elementele din colecția în funcție de producția de test (java.lang.AssertionError:. ToArray () nu returnează toate elementele din colecția)

Nu am putut veni cu orice alt mod de a face cu matrice, și eu nu sunt destul de sigur dacă recurență funcționează chiar. Orice ajutor este apreciat. Mai jos este codul meu:

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 la ieșire:

java.lang.AssertionError: toArray () nu returnează toate elementele din colecția .: TestPerson ( Bender) compareTo (TestPerson ( Fry)) == 0 așteptat:. adevărat, dar a fost: fals la inf1010.assignment .IfiCollectionTest.assertCompareToEquals (IfiCollectionTest.java:74) la inf1010.assignment.IfiCollectionTest.assertCompareToEquals (IfiCollectionTest.java:83) la inf1010.assignment.IfiCollectionTest.assertCompareToEqualsNoOrder (IfiCollectionTest.java:100) la 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);
}

Nu știu dacă ar trebui să posta mai multe din codul de test, este destul de extinse, și ar putea fi un pic prea mult pentru un post?

Întrebat 18/03/2011 la 13:02
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
0

Cred că în cazul în care sunteți confuz este că , dacă a verifica modul in care un binar de căutare de lucrări de copac, este că acesta este întotdeauna sortate. Începi de la nodul rădăcină, și apoi pe măsură ce se introduce un nou nod, acesta îl introduce în poziția corespunzătoare ( de exemplu , la stânga sau la dreapta) , în funcție de valorile. Deci , nu ar trebui să sun un fel pentru a începe cu. Deci , aș începe acolo, și citi pe arbori de căutare binare. De exemplu , wikipedia are un articol decent.

Actualizare: Ignoră comentariul meu n-ar trebui să facă acest lucru, fie. Să presupunem că inserați 8, 3, 7, 9, 12, 2, 10, 1 în copac, în această ordine. Ar trebui să ajung să privească așa:

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

Dacă te uiți la ea ceea ce înseamnă că pentru a le obține, în ordine, începe de la rădăcină, atunci dacă are un nod la stânga a ajuns la stânga, dacă nu, se întoarce, și du-te la dreapta dacă acesta are o valoare. Repetând acest lucru pentru fiecare nod întâlniți.

Publicat 18/03/2011 la 13:30
sursa de către utilizator

voturi
1

Văd că aveți codul

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

dar eu nu pot par să găsească, moment în care ați setat înapoi curent la nodul curent, astfel încât, atunci când faci

a[i] = current.obj;

veți obține rezultatul corect. Asta e, probabil, motivul pentru care nu obține toate rezultatele. În orice caz, eu nu văd (cel puțin din fragmentele de cod la care ai scris) de ce are nevoie de curent pentru a fi o variabilă de clasă și nu doar declarate în metoda de sortare. În general, nu ar trebui să fie folosind variabile de clasă, dacă nu într-adevăr nevoie de ele.

Editare: fie Puteți seta curent înapoi la nodul de procesați după apel sortare pe copilul din stânga ca aceasta

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

Sau nu utilizați curent deloc în cazul în care ai avea ceva de genul

if (n.left != null)
    sort(n.left, a);
a[i] = n.obj;
i++;
if (n.right != null)
    sort(n.right, a);
Publicat 18/03/2011 la 13:57
sursa de către utilizator

voturi
0

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

Cel mai simplu mod de a face ceea ce căutați este de a traversa arborele inorder și să adăugați la un ArrayList. Pentru a obține matrice puteți apela .toArray () metoda de ArrayList.

Dacă nu puteți utiliza un ArrayList, declara un index și o matrice în afara inordertraversal și increment, va trebui să știe câte elemente sunt în copac pentru a declara matrice ta.

pseudo cod:

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)
    }
}
Publicat 18/03/2011 la 14:01
sursa de către utilizator

voturi
1

Ok, cred că problema este utilizarea de către dvs. a variabilei „globale“ current. Modul în care este stabilit, nu are prea mult sens. Nu aveți nevoie să oricum, pentru că „curent“ Nodeeste cea care este prevăzută în parametrii.

De asemenea , ar trebui să ia în considerare redenumirea funcția. Nu sortați nimic aici, doar colectarea de conținutul de copac, astfel încât un nume precum collectar fi mai potrivite.

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;
}

(Disclaimer: Eu nu am testat acest lucru)


implementare alternativă fără indicele la nivel mondial:

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;
}
Publicat 18/03/2011 la 14:07
sursa de către utilizator

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