Advertisement
MaksNew

Untitled

Mar 11th, 2021
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.39 KB | None | 0 0
  1. public static class BTreePrinter
  2. {
  3.     class NodeInfo
  4.     {
  5.         public BNode Node;
  6.         public string Text;
  7.         public int StartPos;
  8.         public int Size { get { return Text.Length; } }
  9.         public int EndPos { get { return StartPos + Size; } set { StartPos = value - Size; } }
  10.         public NodeInfo Parent, Left, Right;
  11.     }
  12.  
  13.     public static void Print(this BNode root, int topMargin = 2, int leftMargin = 2)
  14.     {
  15.         if (root == null) return;
  16.         int rootTop = Console.CursorTop + topMargin;
  17.         var last = new List<NodeInfo>();
  18.         var next = root;
  19.         for (int level = 0; next != null; level++)
  20.         {
  21.             var item = new NodeInfo { Node = next, Text = next.item.ToString(" 0 ") };
  22.             if (level < last.Count)
  23.             {
  24.                 item.StartPos = last[level].EndPos + 1;
  25.                 last[level] = item;
  26.             }
  27.             else
  28.             {
  29.                 item.StartPos = leftMargin;
  30.                 last.Add(item);
  31.             }
  32.             if (level > 0)
  33.             {
  34.                 item.Parent = last[level - 1];
  35.                 if (next == item.Parent.Node.left)
  36.                 {
  37.                     item.Parent.Left = item;
  38.                     item.EndPos = Math.Max(item.EndPos, item.Parent.StartPos);
  39.                 }
  40.                 else
  41.                 {
  42.                     item.Parent.Right = item;
  43.                     item.StartPos = Math.Max(item.StartPos, item.Parent.EndPos);
  44.                 }
  45.             }
  46.             next = next.left ?? next.right;
  47.             for (; next == null; item = item.Parent)
  48.             {
  49.                 Print(item, rootTop + 2 * level);
  50.                 if (--level < 0) break;
  51.                 if (item == item.Parent.Left)
  52.                 {
  53.                     item.Parent.StartPos = item.EndPos;
  54.                     next = item.Parent.Node.right;
  55.                 }
  56.                 else
  57.                 {
  58.                     if (item.Parent.Left == null)
  59.                         item.Parent.EndPos = item.StartPos;
  60.                     else
  61.                         item.Parent.StartPos += (item.StartPos - item.Parent.EndPos) / 2;
  62.                 }
  63.             }
  64.         }
  65.         Console.SetCursorPosition(0, rootTop + 2 * last.Count - 1);
  66.     }
  67.  
  68.     private static void Print(NodeInfo item, int top)
  69.     {
  70.         SwapColors();
  71.         Print(item.Text, top, item.StartPos);
  72.         SwapColors();
  73.         if (item.Left != null)
  74.             PrintLink(top + 1, "┌", "┘", item.Left.StartPos + item.Left.Size / 2, item.StartPos);
  75.         if (item.Right != null)
  76.             PrintLink(top + 1, "└", "┐", item.EndPos - 1, item.Right.StartPos + item.Right.Size / 2);
  77.     }
  78.  
  79.     private static void PrintLink(int top, string start, string end, int startPos, int endPos)
  80.     {
  81.         Print(start, top, startPos);
  82.         Print("─", top, startPos + 1, endPos);
  83.         Print(end, top, endPos);
  84.     }
  85.  
  86.     private static void Print(string s, int top, int left, int right = -1)
  87.     {
  88.         Console.SetCursorPosition(left, top);
  89.         if (right < 0) right = left + s.Length;
  90.         while (Console.CursorLeft < right) Console.Write(s);
  91.     }
  92.  
  93.     private static void SwapColors()
  94.     {
  95.         var color = Console.ForegroundColor;
  96.         Console.ForegroundColor = Console.BackgroundColor;
  97.         Console.BackgroundColor = color;
  98.     }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement