Sortuj Array przed dodaniem do binarne drzewo poszukiwań Java

głosy
0

Mam tablicę łańcuchów, które są w porządku AZ. Zastanawiałem się, że najlepszym sposobem, aby przejść o sortując je na zrównoważony binarne drzewo poszukiwań. Moją pierwszą myślą jest, aby podzielić się tablicę w pierwszej połowie i drugiej połowie, a następnie posortować je indywidualnie.

Nie powinien być w stanie użyć rekurencyjnej sposób, aby zachować rozdzielając go na pół, aby dostać się do następnego węzła w drzewie? Po prostu nie mogę owinąć głowę wokół niego teraz i że chciałbym zapytać, czy ktoś miał jakieś pomysły. prowadzi mnie we właściwym kierunku lub podać kilka przykładów. Dzięki!

używam moje własne klasy BinaryTree i BinaryTreeNode klasy. EDYTOWAĆ:

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

byłoby to uznać za samodzielną równoważenia binarne drzewo poszukiwań?

Utwórz 07/11/2011 o 09:32
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
0

Jeśli masz przeszukiwania binarnego drzewa, które jest samobalansujący jest całkiem prawdopodobnie nieproduktywne wstępnie posortować tablicę. Algorytm optymalny dodanie posortowane dane do zrównoważonego drzewa jest całkiem inna od algorytmu dodawania dane nieuporządkowane.

Jednak nie ma nic „samobalansujący” o kodzie pisał. To jest po prostu zwykłym algorytm wstawiania drzewo binarne.

Odpowiedział 07/11/2011 o 09:37
źródło użytkownik

głosy
1

Drzewo nie wydaje się być bilansowanie siebie. Samobalansujący BST podejmie kroki, po wprowadzeniu, lub po kilku wstawek, aby upewnić się, że jest (w przybliżeniu) zrównoważone.

Jeśli tylko dodać elementy raz i użyć drzewa tylko czyta, masz posortowaną tablicę, a następnie postępować w następujący sposób: wybrać element w środku. utworzyć pierwiastek z nim jako klucz, a następnie rekursywnie dodać elementy do jego lewej strony (z mniejszych elementów) jako lewym poddrzewie swojego korzenia, a elementy jego prawa jako prawego poddrzewa, odpowiednio. Należy skończyć z BST, który jest mniej lub bardziej zrównoważony. Przykład Kod:

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

    /* ... */
}

Jednak w tym przypadku, można po prostu zachować elementy w posortowanej tablicy i używać przeszukiwanie binarne do indeksu do niego, zamiast drzewa. Złożoność powinien być taki sam, O (logn), ale trzeba mniej odniesień do przechowywania całość, a wydajność cache powinno być lepiej.

Jeśli trzeba mieć zmienny drzewo, i chcemy, aby było skuteczne, to prawdopodobnie trzeba zrobić to samo wyważone, przypadek, w którym kolejność dodawać elementy to nie ma znaczenia.

Odpowiedział 07/11/2011 o 09:51
źródło użytkownik

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