equilibrato albero binario di ricerca utilizzando SortedSet

voti
0

Please help ho cercato di generare un casuale albero binario di ricerca di dimensioni 1024 e gli elementi deve essere SortedSet caso ... Sono in grado di scrivere un codice per creare manualmente un albero binario di ricerca aggiungendo manualmente elementi, ma io' m unablele yo scrivere un codice che avrebbe generato un albero binario bilanciato casuale di dimensione 1024 quindi utilizzare cercare di trovare una chiave in quell'albero ... per favore prega e ringrazia la u avanti ....

Modifica aggiunto codice commenti

ya è compiti ... e questo è quello che ho ottenuto finora come codice:

using System; 
namespace bst { 
    public class Node { 
        public int value; 
        public Node Right = null; 
        public Node Left = null; 

        public Node(int value) 
        { 
            this.value = value; 
        } 
    } 

    public class BST { 
        public Node Root = null; 
        public BST() { }

        public void Add(int new_value) 
        { 
            if(Search(new_value)) 
            {
                Console.WriteLine(value ( + new_value + ) already);
            }
            else
            {
                AddNode(this.Root,new_value);
            }
        }
    }
}
È pubblicato 21/01/2011 alle 00:53
fonte dall'utente
In altre lingue...                            


2 risposte

voti
2

Usare la ricorsione. Ogni ramo genera un nuovo ramo, selezionare la voce di mezzo nel set indifferenziati, la mediana. Mettilo nella voce corrente nella struttura. Copiare tutti gli elementi inferiore alla mediana ad un altro array, inviare tale nuovo array alla chiamata dello stesso metodo. Copiare tutti gli elementi superiore alla mediana di un altro array, invio che nuovo array alla chiamata dello stesso metodo. \

alberi bilanciati avere un numero dispari di elementi, a meno che il nodo principale principale non è riempito. È necessario decidere se ci sono due valori che sono la mediana, se il duplicato appartiene al ramo inferiore o ramo superiore. Ho messo i duplicati sul ramo superiore nel mio esempio.

La mediana sarà il numero dove una pari quantità di numeri è inferiore e superiore al numero. 1,2,3,3,4,18,29,105,123 In questo caso, la mediana è 4, anche se la media (o medio) è molto più alta.

Non ho incluso il codice che determina la mediana.

BuildTreeItem(TreeItem Item, Array Set)  
{
  Array Smalls;
  Array Larges;
  Median = DetermineMedian(Set);
  Item.Value = Median;
  if(Set.Count() == 1)
    return;  
  for (int i = 0; int i < Set.Count(); i++)
  {
    if(Set[i] < Median)
    {
      Smalls.new(Set[i]);
    }
    else
    {
      Larges.new(Set[i]);
    }
  }
  Item.Lower = new TreeItem;
  Item.Upper = new TreeItem;
  BuildTreeItem(TreeItem.Lower, Smalls);
  BuildTreeItem(TreeItem.Upper, Larges);
}
Risposto il 21/01/2011 a 01:13
fonte dall'utente

voti
0

A meno che non è compito la soluzione più semplice sarebbe quella di ordinare i dati e poi costruire un albero utilizzando elemento centrale come root e scendendo verso il basso ogni mezzo. Metodo proposto da Xaade è simile , ma molto più lento a causa della complessità DetermineMedian .

L'altra opzione è quella di guardare in realtà ad algoritmi che costruiscono alberi bilanciati (come http://en.wikipedia.org/wiki/Red-black_tree ) per vedere se si adatta alle vostre esigenze.

EDIT: la rimozione di dichiarazione erronea circa la velocità di algoritmo Xaade - è in realtà il più velocemente rapido tipo (n log n - verificare ogni elemento ad ogni livello di ricorsione con log n livelli di ricorsione), non so perché ho stimato più lento.

Risposto il 21/01/2011 a 02:42
fonte dall'utente

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