public static MyArbol <T3> CopiaArbol <T3>(Arbol <T3> raiz)
        {
            MyArbol <T3> temp = new MyArbol <T3>(raiz.Valor, new MyArbol <T3> [0]);

            CopiaArbol(raiz, temp);
            return(temp);
        }
            public MyArbol <T1> AgregaHijo(T1 valorHijo)
            {
                MyArbol <T1> temp = new MyArbol <T1>(valorHijo, new MyArbol <T1> [0]);

                this.hijos.Add(temp);
                return(temp);
            }
 public static void CopiaArbol <T2>(Arbol <T2> arbolActual, MyArbol <T2> copiaActual)
 {
     foreach (var hijo in arbolActual.Hijos)
     {
         MyArbol <T2> hijoCopiaActual = copiaActual.AgregaHijo(hijo.Valor);
         CopiaArbol(hijo, hijoCopiaActual);
     }
 }
 public static void Poda <T4>(MyArbol <T4> arbolActual, MyArbol <T4> padre, List <T4> elementos)
 {
     if (arbolActual.Hijos.Count == 0)
     {
         elementos.Add(arbolActual.Valor);
         if (arbolActual != padre)
         {
             padre.EliminaHijo(arbolActual);
         }
     }
     foreach (var hijo in arbolActual.Hijos)
     {
         Poda(hijo, arbolActual, elementos);
     }
 }
        public static IEnumerable <R> IteraHojas <T7, R>(Arbol <T7> arbol, Func <T7, R> operacion)
        {
            List <T7> elementosOrdenados = new List <T7>();

            MyArbol <T7> myCopia = CopiaArbol(arbol);

            while (myCopia.Hijos.Count != 0)
            {
                Poda(myCopia, myCopia, elementosOrdenados);
            }
            elementosOrdenados.Add(arbol.Valor);

            foreach (var el in elementosOrdenados)
            {
                yield return(operacion(el));
            }
        }
 public void EliminaHijo(MyArbol <T1> hijo)
 {
     this.hijos.Remove(hijo);
 }