équilibré arbre de recherche binaire en utilisant SortedSet

voix
0

S'il vous plaît aider J'ai essayé de générer un arbre de recherche binaire aléatoire de taille 1024 et les éléments a besoin d'être SortedSet au hasard ... Je suis capable d'écrire un code pour créer un arbre de recherche binaire manuellement en ajoutant des éléments manuellement, mais je m unablele yo écrire un code qui générerait un arbre binaire équilibré aléatoire de taille 1024 puis utilisez essayer de trouver une clé dans cet arbre ... s'il vous plaît et merci u s'il vous plaît avant ....

Modifier ajouté le code de commentaires

ya il est des devoirs ... et ce que je suis arrivé à ce jour 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);
            }
        }
    }
}
Créé 21/01/2011 à 00:53
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

Utilisez récursivité. Chaque branche génère une nouvelle branche, sélectionnez l'élément du milieu dans l'ensemble non triés, la médiane. Mettez-le dans l'élément en cours dans l'arborescence. Copiez tous les éléments moins que la médiane à un autre tableau, envoyer ce nouveau tableau à l'appel de la même méthode. Copie tous les éléments supérieure à la médiane à un autre tableau, envoyer ce nouveau tableau à l'appel de la même méthode. \

arbres équilibrés doivent avoir un nombre impair d'éléments, à moins que le principal nœud parent n'est pas rempli. Vous devez décider s'il y a deux valeurs qui sont la médiane, si le double appartient à la branche inférieure ou branche supérieure. Je mets en double dans la branche supérieure dans mon exemple.

La médiane sera le nombre où une quantité égale de nombres est inférieur et supérieur au nombre. 1,2,3,3,4,18,29,105,123 Dans ce cas, la médiane est de 4, même si la moyenne (ou moyenne) est beaucoup plus élevé.

Je ne mentionnaient pas le code qui détermine la médiane.

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);
}
Créé 21/01/2011 à 01:13
source utilisateur

voix
0

À moins qu'il est devoir solution la plus simple serait de trier les données d' abord, puis construire un arbre à l'aide d' élément du milieu en tant que root et descendant en bas de chaque moitié. Méthode proposée par Xaade est similaire , mais beaucoup plus lent en raison de la complexité DetermineMedian .

L'autre option est de regarder en fait à des algorithmes qui construisent des arbres équilibrés (comme http://en.wikipedia.org/wiki/Red-black_tree ) pour voir si elle correspond à vos besoins.

EDIT: suppression des informations erronées concernant la vitesse de l'algorithme Xaade - il est en fait aussi vite que tri rapide (n log n - vérifier chaque élément sur tous les niveaux de récursivité avec log n niveaux de récursivité), ne sais pas pourquoi j'évaluait plus lent.

Créé 21/01/2011 à 02:42
source utilisateur

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