Exemple #1
0
        /// <summary>
        /// Génère un arbre aléatoirement de taille (max - min + 1)
        /// </summary>
        /// <param name="rand">Générateur utilisé</param>
        /// <param name="freqEmbranchement">Fréquence relative des embranchements</param>
        /// <param name="freqTigeGauche">Fréquence relative des tiges gauches</param>
        /// <param name="freqTigeDroite">Fréquence relative des tiges droites</param>
        /// <param name="max">Valeur maximale dans l'arbre</param>
        /// <param name="min">Valeur minimale dans l'arbre</param>
        /// <param name="mult">Multiplicateur pour la valeur</param>
        /// <returns>Un arbre binaire aléatoire</returns>
        private static Noeud Arbre(
            this Random rand,
            int freqEmbranchement,
            int freqTigeGauche,
            int freqTigeDroite,
            int max,
            int min  = 1,
            int mult = 1)
        {
            if (max < min)
            {
                throw new ArgumentOutOfRangeException();
            }

            // Si max == min alors retourner une feuille
            if (max == min)
            {
                return(new Noeud(min * mult));
            }

            int freqTotale = freqTigeGauche + freqTigeDroite;

            // S'il y a au moins 3 noeuds, alors on peut envisager un embranchement
            if (max - min > 1)
            {
                freqTotale += freqEmbranchement;
            }
            // Dans le cas rare ou la frequence totale est 0,
            // alors on choisit tige gauche ou droite au hasard
            if (freqTotale == 0)
            {
                freqTotale     = 2;
                freqTigeDroite = freqTigeGauche = 1;
            }

            int n = rand.Next(freqTotale);

            // Tige gauche
            if (n < freqTigeGauche)
            {
                return(new Noeud(max * mult, gauche: rand.Arbre(freqEmbranchement, freqTigeGauche, freqTigeDroite, max - 1, min)));
            }
            n -= freqTigeGauche;

            // Tige droite
            if (n < freqTigeDroite)
            {
                return(new Noeud(min * mult, droite: rand.Arbre(freqEmbranchement, freqTigeGauche, freqTigeDroite, max, min + 1)));
            }

            // Embranchement
            int med = rand.Next(min + 1, max);

            return(new Noeud(med * mult
                             , gauche: rand.Arbre(freqEmbranchement, freqTigeGauche, freqTigeDroite, med - 1, min)
                             , droite: rand.Arbre(freqEmbranchement, freqTigeGauche, freqTigeDroite, max, med + 1)
                             ));
        }