arbore binar de căutare echilibrată folosind sortedset

voturi
0

Vă rugăm să ajute Am încercat să genereze un arbore binar de căutare aleatoare de dimensiune 1024 și elementele trebuie să fie sortedset întâmplare ... Sunt în stare să scrie un cod pentru a crea manual un arbore binar de căutare prin adăugarea manuală elemente, dar am“ m unablele yo scrie un cod care ar genera un arbore binar echilibrat aleatoare de dimensiune 1024, apoi utilizați încerca să găsească o cheie în acel copac ... vă rugăm să vă rugăm să și mulțumesc u înainte ....

Editare adăugat cod de comentarii

ya este temele ... și asta este ceea ce am primit până în prezent sub formă de cod:

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);
            }
        }
    }
}
Întrebat 21/01/2011 la 00:53
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
2

Utilizați recursivitate. Fiecare ramură generează o nouă ramură, selectați elementul de mijloc din set nesortate, mediana. Pune-l în elementul curent din arbore. Copiați toate elementele mai puțin decât mediana la un alt matrice, trimite ca matrice nou la apelul de aceeași metodă. Copiați toate elementele mai mari decât mediana la un alt matrice, trimit matrice nou la apelul de aceeași metodă. \

copaci echilibrate trebuie să aibă un număr impar de elemente, cu excepția cazului în nodul principal părinte nu este completat. Trebuie să decideți dacă există două valori care sunt medianei, dacă duplicatul aparține pe ramura inferioară sau superioară ramurii. Am pus duplicate de pe ramura de sus în exemplul meu.

Mediana va fi numărul în cazul în care o cantitate egală de numere este mai mică și mai mare decât numărul. 1,2,3,3,4,18,29,105,123 În acest caz, mediana este de 4, chiar dacă media (sau media) este mult mai mare.

Nu am inclus un cod care determină 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);
}
Publicat 21/01/2011 la 01:13
sursa de către utilizator

voturi
0

Doar dacă nu este temele cea mai simplă soluție ar fi pentru a sorta date mai întâi și apoi a construi un copac folosind elementul de mijloc ca root și să coboare în fiecare jumătate. Metoda propusă de Xaade este similară , dar mult mai lent din cauza complexității DetermineMedian .

Cealaltă opțiune este să se uite de fapt , la algoritmi care construiesc arbori echilibrate (cum ar fi http://en.wikipedia.org/wiki/Red-black_tree ) pentru a vedea dacă se potrivește cerințele dumneavoastră.

EDIT: eliminarea greșita despre viteza de Xaade algoritm - este de fapt la fel de rapid ca și sortare rapidă (n log - verifica fiecare element de la fiecare nivel de recursie cu log n nivele de recursie), nu sunt sigur de ce am estimat că mai lent.

Publicat 21/01/2011 la 02:42
sursa de către utilizator

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