Beispiel #1
0
        //private static Noeud[] Tnooeud;
        //private static Liason[] TLiason;
        //private static Lettre[] TLettre;

        /// <summary>
        /// la fonction genererArbre est tres importante dans ceux programer. c'est elle qui va generer les differents
        /// noeud et liaison que comporte un arbre. un arbre est composé de n noeud initiaux, n-1 noeuds secondaire et 2n-2 liaison
        /// </summary>
        /// <param name="TLettre"></param>
        public static void genererArbre(ref Lettre[] TLettre, ref Noeud[] TNoeudInitial, ref Noeud[] TNoeudSecondaire)
        {
            int taille = TNoeudInitial.Length; // taille est la taille du tableau de noeud initiale

            // creation de la copie de la table noeud initiale
            Noeud[] TNIcopie;
            TNIcopie = new Noeud[taille];

            //creation des noeuds secondaires

            TNoeudSecondaire = new Noeud[taille - 1];
            for (int i = 0; i < TNoeudSecondaire.Length; i++)
            {
                TNoeudSecondaire[i] = new Noeud();
            }

            Noeud[] TNoeudSecondaireOrigninal;
            TNoeudSecondaireOrigninal = new Noeud[taille - 1];
            for (int i = 0; i < TNoeudSecondaireOrigninal.Length; i++)
            {
                TNoeudSecondaireOrigninal[i] = new Noeud();
            }

            //creation des liaisons;
            Liason[] TLiaison;
            TLiaison = new Liason[(2 * taille) - 2];

            //remplissage de la table TNIcpopie
            for (int i = 0, c = taille; i < c; i++)
            {
                TNIcopie[i] = new Noeud();
                TNIcopie[i] = TNoeudInitial[i];
            }

            //// #test affichage de TniCopie

            Console.WriteLine("\n affichage de Tnicopie \n");
            for (int i = 0, c = taille; i < c; i++)
            {
                Console.WriteLine(TNIcopie[i]);
            }

            //generation de l'arbre
            //ici on va juste remplir le tableau TNoeudScecondaire avec les bonnes valeurs
            Console.WriteLine("\n debut de la creation de l'arbre \n");
            Noeud min1 = new Noeud();
            Noeud min2 = new Noeud();
            int   indice1 = 0, indice2 = 0;
            int   position         = 0;
            int   positionOriginal = 0;

            // #Debut
            while (positionOriginal <= TNoeudSecondaireOrigninal.Length - 1)
            {
                //recherdche du premier plus petit element
                #region Recherche du premier plus petit element
                /*****************************************************************************************************************/
                //recherche dans le premier tableau (TNIcopie)
                // #test  affichage de la taille de tniCopie
                Console.WriteLine(TNIcopie.Length);
                if (TNIcopie.Length > 0)
                {
                    min1 = TNIcopie[TNIcopie.Length - 1];
                    Console.WriteLine(min1.ToString() + " Meckde");

                    indice1 = 0;
                    for (int i = TNIcopie.Length - 1; i >= 0; i--)
                    {
                        if (min1.Val > TNIcopie[i].Val)
                        {
                            min1 = TNIcopie[i];
                            for (int x = 0; x < TNoeudInitial.Length; x++)
                            {
                                if (TNIcopie[i].Numero == TNoeudInitial[x].Numero)
                                {
                                    TNoeudInitial[x].Position = "gauche";
                                    min1 = TNoeudInitial[x];
                                    Console.WriteLine("cool gauche");
                                }
                            }
                            indice1 = i;
                        }
                    }
                }
                else
                {
                    Console.WriteLine("pas cool gauche");
                    min1    = TNoeudSecondaire[0];
                    indice1 = TNIcopie.Length;
                }

                //recherche dans le second tableau (TNoeudSecondaire)
                for (int i = 0; i < TNoeudSecondaire.Length; i++)
                {
                    if ((min1.Val > TNoeudSecondaire[i].Val) && TNoeudSecondaire[i].Val != 0)
                    {
                        min1 = TNoeudSecondaire[i];
                        for (int x = 0; x < TNoeudSecondaireOrigninal.Length; x++)
                        {
                            if (TNoeudSecondaire[i].Numero == TNoeudSecondaireOrigninal[x].Numero)
                            {
                                TNoeudSecondaireOrigninal[x].Position = "gauche";
                                Console.WriteLine("cool gauche");
                            }
                        }
                        indice1 = i + TNIcopie.Length;
                    }
                }

                // #test affichage de min1
                Console.WriteLine(min1 + "yoooooye 1");

                if (0 <= indice1 && indice1 <= TNIcopie.Length - 1)//si l'indice1 est compris entre le premier et le dernier indice de TNIcopie (le premier tableau)
                {
                    //on suprime l'element correspondant a cet indice dans le premier tableau (TNIcopie)
                    for (int i = min1.Numero; i < TNIcopie.Length - 1; i++)
                    {
                        TNIcopie[i] = TNIcopie[i + 1];
                    }
                    Array.Resize(ref TNIcopie, TNIcopie.Length - 1);
                }
                else//on suprime l'element correspondant a cet indice dans le second tableau  (TNoeudSecondaire)
                {
                    //for (int v = min1.Numero; v < TNoeudSecondaire.Length - 1; v++)
                    //{
                    //    TNoeudSecondaire[v] = TNoeudSecondaire[v + 1];
                    //}
                    for (int v = 0; v < TNoeudSecondaire.Length; v++)
                    {
                        if (TNoeudSecondaire[v].Numero == min1.Numero)
                        {
                            break;
                        }
                    }
                    for (int v = 0; v < TNoeudSecondaire.Length - 1; v++)
                    {
                        Console.WriteLine("  ++++ je d'accorise   \n");
                        TNoeudSecondaire[v] = TNoeudSecondaire[v + 1];
                    }



                    Array.Resize(ref TNoeudSecondaire, TNoeudSecondaire.Length - 1);
                    position -= 1;
                }
                #endregion

/***************************************************************************************************************************************/
                #region Recherche du second plus petit element
                ///// #test
                Console.WriteLine("wayaye " + TNIcopie.Length + " " + (TNIcopie.Length - 1));
                //Console.ReadKey();
                if (TNIcopie.Length > 0)
                {
                    min2 = TNIcopie[TNIcopie.Length - 1];


                    indice2 = 0;
                    //recherche dans le premier tableau (TNIcopie)
                    for (int i = TNIcopie.Length - 1; i >= 0; i--)
                    {
                        if (min2.Val > TNIcopie[i].Val)
                        {
                            min2 = TNIcopie[i];
                            for (int x = 0; x < TNoeudInitial.Length; x++)
                            {
                                if (TNIcopie[i].Numero == TNoeudInitial[x].Numero)
                                {
                                    TNoeudInitial[x].Position = "droite";
                                    Console.WriteLine("cool droite");
                                }
                            }
                            indice2 = i;
                        }
                    }
                }
                else // si le premier tableau ne contient plus des valeurs
                {
                    Console.WriteLine("pas cool droite");
                    min2    = TNoeudSecondaire[0];
                    indice2 = TNIcopie.Length;
                }

                //recherche dans le second tableau (TNoeudSecondaire)
                for (int i = 0; i < TNoeudSecondaire.Length; i++)
                {
                    if ((min2.Val > TNoeudSecondaire[i].Val) && TNoeudSecondaire[i].Val != 0)
                    {
                        min2 = TNoeudSecondaire[i];
                        for (int x = 0; x < TNoeudSecondaireOrigninal.Length; x++)
                        {
                            if (TNoeudSecondaire[i].Numero == TNoeudSecondaireOrigninal[x].Numero)
                            {
                                TNoeudSecondaireOrigninal[x].Position = "droite";
                                Console.WriteLine("cool droite");
                            }
                        }
                        indice2 = i + TNIcopie.Length;
                    }
                }

                if (0 <= indice2 && indice2 <= TNIcopie.Length - 1)//si l'indice2 est compris entre le premier et le dernier indice de TNIcopie (le premier tableau)
                {
                    //on suprime l'element correspondant a cet indice dans le premier tableau (TNIcopie)
                    for (int i = min2.Numero; i < TNIcopie.Length - 1; i++)
                    {
                        TNIcopie[i] = TNIcopie[i + 1];
                    }
                    Array.Resize(ref TNIcopie, TNIcopie.Length - 1);
                }
                else//on suprime l'element correspondant a cet indice dans le second tableau  (TNoeudSecondaire)
                {
                    Console.WriteLine(min2.Numero + "  malchance   \n");
                    for (int v = 0; v < TNoeudSecondaire.Length; v++)
                    {
                        if (TNoeudSecondaire[v].Numero == min2.Numero)
                        {
                            break;
                        }
                    }
                    for (int v = 0; v < TNoeudSecondaire.Length - 1; v++)
                    {
                        Console.WriteLine("  ++++ je d'accorise   \n");
                        TNoeudSecondaire[v] = TNoeudSecondaire[v + 1];
                    }
                    Array.Resize(ref TNoeudSecondaire, TNoeudSecondaire.Length - 1);
                    position -= 1;
                }
                #endregion
                // #test affichage de min2
                Console.WriteLine(min2 + "yoooooye 2");

                //creation du noeud et des liaisons correspondantes

                TNoeudSecondaire[position] = new Noeud(min1.Val + min2.Val, min1.Numero, min2.Numero, positionOriginal + taille, "");   // creation du noeud
                Console.WriteLine(TNoeudSecondaire[position] + "yoooooye result");
                TNoeudSecondaireOrigninal[positionOriginal] = TNoeudSecondaire[position];
                Console.WriteLine(TNoeudSecondaireOrigninal[positionOriginal] + "yoooooye result original");
                TLiaison[2 * positionOriginal]       = new Liason(2 * positionOriginal, "gauche", min1.Numero, TNoeudSecondaireOrigninal[positionOriginal].Numero, 0);       // creation de la liason gauche
                TLiaison[(2 * positionOriginal) + 1] = new Liason((2 * positionOriginal) + 1, "droite", min2.Numero, TNoeudSecondaireOrigninal[positionOriginal].Numero, 1); // creation de la liaison droite


                position         += 1;
                positionOriginal += 1;
            }


            TNoeudSecondaire = TNoeudSecondaireOrigninal;

            ///// #test

            //affichage des noeuds secondaire
            Console.WriteLine("\n affichage des noeuds secondaire \n");
            for (int i = 0; i < TNoeudSecondaire.Length; i++)
            {
                Console.WriteLine(TNoeudSecondaire[i].ToString());
            }

            //affichage des liaisons
            Console.WriteLine("\n affichage des liaisons \n");
            for (int i = 0; i < TLiaison.Length; i++)
            {
                Console.WriteLine(TLiaison[i].ToString());
            }
            Console.ReadKey();
            fabricationDesChemin0101(TLettre, TNoeudInitial, TNoeudSecondaire, TLiaison);
        }