コード例 #1
0
 private static void Imprimir(NoInfo item, int top)
 {
     TrocarCores(item.No);
     Imprimir(item.Texto, top, item.InicioPos);
     TrocarCores(item.No);
     if (item.Esquerdo != null)
     {
         ImprimirLink(top + 1, "┌", "┘", item.Esquerdo.InicioPos + item.Esquerdo.Tamanho / 2, item.InicioPos);
     }
     if (item.Direito != null)
     {
         ImprimirLink(top + 1, "└", "┐", item.FimPos - 1, item.Direito.InicioPos + item.Direito.Tamanho / 2);
     }
 }
コード例 #2
0
        public static void Imprimir(this No raiz, int margemTopo = 2, int margemEsquerdo = 2)
        {
            if (raiz == null)
            {
                return;
            }

            int rootTop = Console.CursorTop + margemTopo;
            var ultimo  = new List <NoInfo>();
            var proximo = raiz;

            for (int nivel = 0; proximo != null; nivel++)
            {
                var item = new NoInfo {
                    No = proximo, Texto = proximo.Valor.ToString(" 0 ")
                };
                if (nivel < ultimo.Count)
                {
                    item.InicioPos = ultimo[nivel].FimPos + 1;
                    ultimo[nivel]  = item;
                }
                else
                {
                    item.InicioPos = margemEsquerdo;
                    ultimo.Add(item);
                }
                if (nivel > 0)
                {
                    item.Parente = ultimo[nivel - 1];
                    if (proximo == item.Parente.No.FilhoEsquerdo)
                    {
                        item.Parente.Esquerdo = item;
                        item.FimPos           = Math.Max(item.FimPos, item.Parente.InicioPos);
                    }
                    else
                    {
                        item.Parente.Direito = item;
                        item.InicioPos       = Math.Max(item.InicioPos, item.Parente.FimPos);
                    }
                }
                proximo = proximo.FilhoEsquerdo ?? proximo.FilhoDireito;
                for (; proximo == null; item = item.Parente)
                {
                    Imprimir(item, rootTop + 2 * nivel);
                    if (--nivel < 0)
                    {
                        break;
                    }
                    if (item == item.Parente.Esquerdo)
                    {
                        item.Parente.InicioPos = item.FimPos;
                        proximo = item.Parente.No.FilhoDireito;
                    }
                    else
                    {
                        if (item.Parente.Esquerdo == null)
                        {
                            item.Parente.FimPos = item.InicioPos;
                        }
                        else
                        {
                            item.Parente.InicioPos += (item.InicioPos - item.Parente.FimPos) / 2;
                        }
                    }
                }
            }
            Console.SetCursorPosition(0, rootTop + 2 * ultimo.Count - 1);
        }