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); } }
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); }