MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Алгоритм визуализации дерева"
Answer 927746
Как-то так:
using System; using System.Collections.Generic; using System.Text; namespace ConsoleTest { //узел дерева public class TreeNode { public TreeNode(string n) { this.Name = n; this.Children = new List<TreeNode>(); } public string Name { get; set; } //имя узла public int X { get; set; } //горизонтальная координата для отображения (заполняется TreeCalcCoordinates) public int Y { get; set; } //вертикальная координата для отображения (заполняется TreeCalcCoordinates) public List<TreeNode> Children { get; set; } //список дочерних узлов } class Program { //получает суммарное количество всех дочерних узлов (высоту поддерева) static int GetChildrenCountSum(TreeNode node) { if (node.Children.Count == 0) return 1; int c = 0; foreach (TreeNode child in node.Children) c += GetChildrenCountSum(child); return c; } //получает максимальную ширину узла в дереве static void TreeGetMaxWidth(TreeNode root, ref int maxwidth) { if (root.Name.Length > maxwidth) maxwidth = root.Name.Length; foreach (TreeNode child in root.Children) TreeGetMaxWidth(child, ref maxwidth); } static void TreeCalcCoordinates_Recursive(TreeNode node, int basex, int basey, int dx) { node.X = basex; node.Y = basey; int c = basey; foreach (TreeNode child in node.Children) { TreeCalcCoordinates_Recursive(child, basex + dx, c, dx); c += GetChildrenCountSum(child); } } //вычисляет координаты узлов в дереве static void TreeCalcCoordinates(TreeNode root) { int maxwidth = 0; TreeGetMaxWidth(root, ref maxwidth); int dx = maxwidth + 1; TreeCalcCoordinates_Recursive(root, 0, 0, dx); } static void TreePrint_Recursive(TreeNode node) { Console.SetCursorPosition(node.X, node.Y); Console.Write(node.Name); foreach(TreeNode child in node.Children) { TreePrint_Recursive(child); } } //выводит дерево в консоль, используя вычисленные координаты static void TreePrint(TreeNode root) { Console.Clear(); TreePrint_Recursive(root); } static void Main(string[] args) { //заполняем дерево тестовыми данными TreeNode root = new TreeNode("Животные"); TreeNode node = new TreeNode("Млекопитающие"); TreeNode node2 = new TreeNode("Хищные"); node2.Children.Add(new TreeNode("Волк")); node2.Children.Add(new TreeNode("Лиса")); node.Children.Add(node2); node2 = new TreeNode("Зайцеобразные"); node2.Children.Add(new TreeNode("Заяц")); node2.Children.Add(new TreeNode("Кролик")); node.Children.Add(node2); root.Children.Add(node); node = new TreeNode("Птицы"); node.Children.Add(new TreeNode("Пингвин")); node.Children.Add(new TreeNode("Попугай")); node.Children.Add(new TreeNode("Ворона")); root.Children.Add(node); node = new TreeNode("Пресмыкающиеся"); node.Children.Add(new TreeNode("Черепаха")); node.Children.Add(new TreeNode("Крокодил")); root.Children.Add(node); //вычисляем координаты TreeCalcCoordinates(root); //выводим дерево в консоль TreePrint(root); Console.ReadKey(); } } }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.