evenwichtige binaire zoekboom gebruik SortedSet

stemmen
0

Gelieve te helpen Ik heb geprobeerd om een ​​willekeurige binaire zoekboom van grootte 1024 te genereren en de elementen nodig om willekeurige SortedSet zijn ... Ik ben in staat om een ​​code te schrijven naar een binaire zoekboom handmatig maken door elementen handmatig toe te voegen, maar ik' m unablele yo schrijven een code die een willekeurige gebalanceerde binaire boom van grootte 1024 zou genereren gebruik dan proberen om een ​​sleutel in die boom te vinden ... please please en thank u vooruit ....

Bewerken toegevoegd code van commentaar

ya is het huiswerk ... en dit is wat ik kreeg voor zover code:

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);
            }
        }
    }
}
De vraag is gesteld op 21/01/2011 om 00:53
bron van user
In andere talen...                            


2 antwoorden

stemmen
2

Gebruik recursie. Elke tak genereert een nieuwe tak, selecteert u de middelste punt in de ongesorteerde set, de mediaan. Zet het in het huidige item in de boom. Kopieer alle items minder dan de mediaan naar een andere array, stuur die nieuwe array aan de oproep van de dezelfde methode. Kopieer alle items die groter is dan de mediaan naar een andere array, stuur die nieuwe array aan de oproep van de dezelfde methode. \

Balanced bomen moeten een oneven aantal punten hebben, tenzij de belangrijkste bovenliggende node niet is ingevuld. Je moet beslissen of er twee waarden die de Median, of het duplicaat behoort op de onderste tak of het bovenste tak. Ik zette duplicaten op de bovenste tak in mijn voorbeeld.

De mediaan is het nummer waar een gelijke hoeveelheid getallen is minder dan en groter dan het aantal te zijn. 1,2,3,3,4,18,29,105,123 In dit geval is de mediaan is 4, hoewel de gemiddelde (of gemiddelde) is veel hoger.

Ik heb geen code bevatten, dat de mediaan bepaalt.

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);
}
antwoordde op 21/01/2011 om 01:13
bron van user

stemmen
0

Tenzij het huiswerk de gemakkelijkste oplossing zou zijn om de eerste gegevens te sorteren en vervolgens een boom te bouwen door met de middelste punt als root en af te dalen elke helft. Door Xaade voorgestelde methode is vergelijkbaar , maar veel trager als gevolg van DetermineMedian complexiteit .

De andere optie is om daadwerkelijk te kijken naar algoritmen die evenwichtige bomen te bouwen (zoals http://en.wikipedia.org/wiki/Red-black_tree ) om te zien of het past bij uw wensen.

EDIT: het verwijderen van onjuiste uitspraak over de snelheid van Xaade algoritme - het is eigenlijk zo snel als quick sort (n log n - controleer elk element op elk niveau van de recursie met log n niveaus van recursie), niet zeker waarom Ik schatte het langzamer.

antwoordde op 21/01/2011 om 02:42
bron van user

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