balansert binært søketre ved hjelp sortedset

stemmer
0

Vennligst hjelp Jeg har prøvd å generere et tilfeldig binært søketre av størrelse 1024 og elementene må være tilfeldig sortedset ... Jeg er i stand til å skrive en kode for å lage et binært søketre manuelt ved å legge til elementer manuelt, men jeg m unablele yo skrive en kode som ville generere et tilfeldig balansert binært tre av størrelse 1024 og deretter bruke prøve å finne en nøkkel i det treet ... vær så snill og takk u fremover ....

Edit lagt til kode fra kommentarer

ya er det lekser ... og dette er hva jeg kom så langt som kode:

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);
            }
        }
    }
}
Publisert på 20/01/2011 klokken 23:53
kilden bruker
På andre språk...                            


2 svar

stemmer
2

Bruk rekursjon. Hver gren genererer en ny gren, velg midten elementet i usortert sett, medianen. Sett det i gjeldende element i treet. Kopiere alle elementer som er mindre enn medianen til en annen rekke, sende det nye utvalget til samtalen av samme metode. Kopier alle elementer større enn medianen til en annen rekke, sende det nye utvalget til samtalen av samme metode. \

Balanserte trær må ha et ulikt antall elementer, med mindre hovedforeldrenoden ikke er fylt ut. Du må bestemme om det er to verdier som er Median, om duplikat hører på nedre gren eller øvre gren. Jeg satte duplikater på den øvre gren i mitt eksempel.

Median vil være antall hvor en lik mengde av tall er mindre enn og større enn antall. 1,2,3,3,4,18,29,105,123 I dette tilfellet er median fire, selv om den gjennomsnittlige (eller gjennomsnittlig) er mye høyere.

Jeg hadde ikke inneholde kode som bestemmer median.

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);
}
Svarte 21/01/2011 kl. 00:13
kilden bruker

stemmer
0

Med mindre det er lekser den enkleste løsningen ville være å sortere data først og deretter bygge et tre ved hjelp midten element som root og synkende ned hver halvdel. Metoden foreslått av Xaade er lignende , men mye langsommere på grunn av DetermineMedian kompleksitet .

Det andre alternativet er å faktisk se på algoritmer som bygger balanserte trær (som http://en.wikipedia.org/wiki/Red-black_tree ) for å se om det passer dine behov.

EDIT: fjerne feil uttalelse om hastigheten på Xaade algoritme - det er faktisk så fort som rask sort (n log n - sjekk hvert element på hvert nivå av rekursjon med log n nivåer av rekursjon), ikke sikker på hvorfor jeg anslått det tregere.

Svarte 21/01/2011 kl. 01:42
kilden bruker

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