είδος Array πριν από την προσθήκη σε ένα δυαδικό Java Αναζήτηση δέντρο

ψήφοι
0

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

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

Είμαι χρησιμοποιώντας το δικό μου BinaryTree Class και BinaryTreeNode κατηγορίας. ΕΠΕΞΕΡΓΑΣΙΑ:

public class BinaryTree {
private BinaryTreeNode root;

public void insert(String text) {

root = insertNode(root, text); 

}

private BinaryTreeNode insertNode(BinaryTreeNode curNode, String text) {
if (curNode == null) {
    BinaryTreeNode newNode = new BinaryTreeNode(text);
    //newNode.value = text;
    return newNode;
} else {
    if (text.compareTo(curNode.value) < 0 ) {
        //left child
        //use of recursion to properly place Node
        curNode.left = insertNode(curNode.left, text);
        return curNode;
    }

        else {

        //right
        //use of recursion to properly place Node
        curNode.right = insertNode(curNode.right, text);
        return curNode;
    }
}

}

public BinaryTreeNode getRoot() {
return root;
}

 public void setRoot(BinaryTreeNode root) {
this.root = root;
 }
 }

Θα θεωρείται ένα Αυτο εξισορρόπησης δυαδικό δένδρο αναζήτησης;

Δημοσιεύθηκε 07/11/2011 στις 09:32
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
0

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

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

Απαντήθηκε 07/11/2011 στις 09:37
πηγή χρήστη

ψήφοι
1

Δέντρο σας δεν φαίνεται να είναι αυτο εξισορρόπησης. Ένα αυτο-εξισορρόπησης BST θα λάβει μέτρα, μετά από την εισαγωγή, ή μετά από μια σειρά από προσθήκες, για να βεβαιωθείτε ότι είναι (περίπου) ισορροπημένη.

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

public class BinaryTree {

    /* ... */


    //each recursive call receives a pair of bounds for the part of the 
    //array it has to process: left and right
    public static BinaryTreeNode nodeFromSortedArray(String[]a,
                                           int left, int right){

        if (right<left) return null;

        if (right==left)
            return new BinaryTreeNode(a[left]);

        int mid = (left+right)/2;

        //create node from middle element
        BinaryTreeNode n = new BinaryTreeNode(a[mid]);

        //recursively add elements to the left as its right subtree
        n.left = nodeFromSortedArray(a, left, mid-1);

        //recursively add elements to the right as its right subtree
        n.right = nodeFromSortedArray(a, mid+1, right);

        return n;
    }

    public static BinaryTree fromSortedArray(String[]a){
        BinaryTree bt = new BinaryTree();
        bt.setRoot(nodeFromSortedArray(a,0,a.length-1));
        return bt;
    }

    /* ... */
}

Ωστόσο, σε αυτή την περίπτωση, θα μπορούσε απλά να κρατήσει τα στοιχεία σας στον ταξινομημένο πίνακα και να χρησιμοποιήσετε δυαδική αναζήτηση στο ευρετήριο σε αυτό, αντί για ένα δέντρο. Η πολυπλοκότητα πρέπει να είναι το ίδιο, O (logn), αλλά θα πρέπει τουλάχιστον αναφορές για να αποθηκεύσετε το όλο θέμα, και την απόδοση της κρυφής μνήμης πρέπει να είναι καλύτερα.

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

Απαντήθηκε 07/11/2011 στις 09:51
πηγή χρήστη

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