Advertisement
shoodymon

MainWindow.xaml.cs

May 5th, 2024
659
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 37.27 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Data;
  9. using System.Windows.Documents;
  10. using System.Windows.Input;
  11. using System.Windows.Media;
  12. using System.Windows.Media.Imaging;
  13. using System.Windows.Navigation;
  14. using System.Windows.Shapes;
  15. using static Trees_CourseProject.MainWindow;
  16.  
  17. namespace Trees_CourseProject
  18. {
  19.     public class BinarySearchTree
  20.     {
  21.         public class TreeNode
  22.         {
  23.             private int value;
  24.  
  25.             // Открыто доступное свойство Value, которое обеспечивает доступ к значению переменной value извне класса.
  26.             public int Value
  27.             {
  28.                 get { return value; }
  29.                 set
  30.                 {
  31.                     if (value >= -99 && value <= 99)
  32.                     {
  33.                         this.value = value;
  34.                     }
  35.                     else
  36.                     {
  37.                         throw new ArgumentOutOfRangeException("Value must be between -99 and 99");
  38.                     }
  39.                 }
  40.             }
  41.  
  42.             public TreeNode Left { get; set; }
  43.             public TreeNode Right { get; set; }
  44.  
  45.             // Конструктор с одним аргументом для инициализации значения узла
  46.             public TreeNode(int value)
  47.             {
  48.                 Value = value;
  49.                 Left = null;
  50.                 Right = null;
  51.             }
  52.         }
  53.  
  54.         public TreeNode root;
  55.         private Canvas canvas;
  56.  
  57.         public BinarySearchTree(Canvas canvas)
  58.         {
  59.             root = null;
  60.             this.canvas = canvas;
  61.         }
  62.  
  63.         // Метод для добавления значения в дерево
  64.         public void Insert(int value)
  65.         {
  66.             root = Insert(root, value);
  67.             Console.WriteLine($"Inserted node with value {value}");
  68.         }
  69.  
  70.         // Вспомогательный метод для рекурсивного добавления значения в дерево
  71.         private TreeNode Insert(TreeNode node, int value)
  72.         {
  73.             if (node == null)
  74.             {
  75.                 node = new TreeNode(value);
  76.             }
  77.             else if (value < node.Value)
  78.             {
  79.                 node.Left = Insert(node.Left, value);
  80.             }
  81.             else if (value > node.Value)
  82.             {
  83.                 node.Right = Insert(node.Right, value);
  84.             }
  85.             // Если значение уже существует в дереве, ничего не делаем
  86.             return node;
  87.         }
  88.  
  89.         // Метод для удаления значения из дерева
  90.         public void Delete(int value)
  91.         {
  92.             root = Delete(root, value);
  93.             Console.WriteLine($"Deleted node with value {value}");
  94.         }
  95.  
  96.         // Вспомогательный метод для рекурсивного удаления значения из дерева
  97.         private TreeNode Delete(TreeNode node, int value)
  98.         {
  99.             if (node == null)
  100.             {
  101.                 return null;
  102.             }
  103.             else if (value < node.Value)
  104.             {
  105.                 node.Left = Delete(node.Left, value);
  106.             }
  107.             else if (value > node.Value)
  108.             {
  109.                 node.Right = Delete(node.Right, value);
  110.             }
  111.             else
  112.             {
  113.                 // Узел найден, начинаем процесс удаления
  114.                 if (node.Left == null)
  115.                 {
  116.                     return node.Right;
  117.                 }
  118.                 else if (node.Right == null)
  119.                 {
  120.                     return node.Left;
  121.                 }
  122.                 else
  123.                 {
  124.                     // У узла есть оба потомка
  125.                     // Находим наименьший узел в правом поддереве (или наибольший в левом поддереве)
  126.                     TreeNode minRight = FindMin(node.Right);
  127.                     // Копируем значение найденного узла в текущий узел
  128.                     node.Value = minRight.Value;
  129.                     // Рекурсивно удаляем найденный узел
  130.                     node.Right = Delete(node.Right, minRight.Value);
  131.                 }
  132.             }
  133.             return node;
  134.         }
  135.  
  136.         // Метод для поиска наименьшего значения в дереве
  137.         private TreeNode FindMin(TreeNode node)
  138.         {
  139.             while (node.Left != null)
  140.             {
  141.                 node = node.Left;
  142.             }
  143.             return node;
  144.         }
  145.  
  146.         // Метод для поиска значения в дереве
  147.         public bool Search(int value)
  148.         {
  149.             return Search(root, value);
  150.         }
  151.  
  152.         // Вспомогательный метод для рекурсивного поиска значения в дереве
  153.         private bool Search(TreeNode node, int value)
  154.         {
  155.             if (node == null)
  156.             {
  157.                 return false;
  158.             }
  159.             else if (node.Value == value)
  160.             {
  161.                 return true;
  162.             }
  163.             else if (value < node.Value)
  164.             {
  165.                 return Search(node.Left, value);
  166.             }
  167.             else
  168.             {
  169.                 return Search(node.Right, value);
  170.             }
  171.         }
  172.  
  173.         // Методы для обхода дерева в различных порядках (прямом, симметричном и обратном)
  174.         public void PreOrderTraversal()
  175.         {
  176.             PreOrderTraversal(root);
  177.         }
  178.  
  179.         private void PreOrderTraversal(TreeNode node)
  180.         {
  181.             if (node != null)
  182.             {
  183.                 Console.Write(node.Value + " ");
  184.                 PreOrderTraversal(node.Left);
  185.                 PreOrderTraversal(node.Right);
  186.             }
  187.         }
  188.  
  189.         public void InOrderTraversal()
  190.         {
  191.             InOrderTraversal(root);
  192.         }
  193.  
  194.         private void InOrderTraversal(TreeNode node)
  195.         {
  196.             if (node != null)
  197.             {
  198.                 InOrderTraversal(node.Left);
  199.                 Console.Write(node.Value + " ");
  200.                 InOrderTraversal(node.Right);
  201.             }
  202.         }
  203.  
  204.         public void PostOrderTraversal()
  205.         {
  206.             PostOrderTraversal(root);
  207.         }
  208.  
  209.         private void PostOrderTraversal(TreeNode node)
  210.         {
  211.             if (node != null)
  212.             {
  213.                 PostOrderTraversal(node.Left);
  214.                 PostOrderTraversal(node.Right);
  215.                 Console.Write(node.Value + " ");
  216.             }
  217.         }
  218.  
  219.     }
  220.  
  221.     public class AVLTree
  222.     {
  223.         public class AVLNode
  224.         {
  225.             public int Value;
  226.             public int Height;
  227.             public AVLNode Left;
  228.             public AVLNode Right;
  229.  
  230.             public AVLNode(int value)
  231.             {
  232.                 Value = value;
  233.                 Height = 1;
  234.                 Left = null;
  235.                 Right = null;
  236.             }
  237.         }
  238.  
  239.         public AVLNode root;
  240.         private Canvas canvas;
  241.  
  242.         public AVLTree(Canvas canvas)
  243.         {
  244.             root = null;
  245.             this.canvas = canvas;
  246.         }
  247.  
  248.         private int Height(AVLNode node)
  249.         {
  250.             return node == null ? 0 : node.Height;
  251.         }
  252.  
  253.         private int BalanceFactor(AVLNode node)
  254.         {
  255.             return Height(node.Left) - Height(node.Right);
  256.         }
  257.  
  258.         private void UpdateHeight(AVLNode node)
  259.         {
  260.             node.Height = 1 + Math.Max(Height(node.Left), Height(node.Right));
  261.         }
  262.  
  263.         private AVLNode RightRotate(AVLNode pivot)
  264.         {
  265.             AVLNode newRoot = pivot.Left;
  266.             pivot.Left = newRoot.Right;
  267.             newRoot.Right = pivot;
  268.             UpdateHeight(pivot);
  269.             UpdateHeight(newRoot);
  270.             return newRoot;
  271.         }
  272.  
  273.         private AVLNode LeftRotate(AVLNode newRoot)
  274.         {
  275.             AVLNode pivot = newRoot.Right;
  276.             newRoot.Right = pivot.Left;
  277.             pivot.Left = newRoot;
  278.             UpdateHeight(newRoot);
  279.             UpdateHeight(pivot);
  280.             return pivot;
  281.         }
  282.  
  283.         private AVLNode Insert(AVLNode node, int value)
  284.         {
  285.             if (node == null)
  286.                 return new AVLNode(value);
  287.  
  288.             if (value < node.Value)
  289.                 node.Left = Insert(node.Left, value);
  290.             else if (value > node.Value)
  291.                 node.Right = Insert(node.Right, value);
  292.             else
  293.                 return node; // Значение уже существует в дереве, ничего не делаем
  294.  
  295.             UpdateHeight(node);
  296.  
  297.             int balance = BalanceFactor(node);
  298.  
  299.             // Перебалансировка дерева, если необходимо
  300.             if (balance > 1)
  301.             {
  302.                 // Вставленное значение меньше значения в левом поддереве
  303.                 if (value < node.Left.Value)
  304.                     return RightRotate(node);
  305.                 // Вставленное значение больше значения в левом поддереве
  306.                 if (value > node.Left.Value)
  307.                 {
  308.                     node.Left = LeftRotate(node.Left);
  309.                     return RightRotate(node);
  310.                 }
  311.             }
  312.             else if (balance < -1)
  313.             {
  314.                 // Вставленное значение больше значения в правом поддереве
  315.                 if (value > node.Right.Value)
  316.                     return LeftRotate(node);
  317.                 // Вставленное значение меньше значения в правом поддереве
  318.                 if (value < node.Right.Value)
  319.                 {
  320.                     node.Right = RightRotate(node.Right);
  321.                     return LeftRotate(node);
  322.                 }
  323.             }
  324.  
  325.             return node;
  326.         }
  327.  
  328.         public void Insert(int value)
  329.         {
  330.             root = Insert(root, value);
  331.         }
  332.  
  333.         private AVLNode Delete(AVLNode root, int key)
  334.         {
  335.             if (root == null)
  336.                 return root;
  337.  
  338.             if (key < root.Value)
  339.                 root.Left = Delete(root.Left, key);
  340.             else if (key > root.Value)
  341.                 root.Right = Delete(root.Right, key);
  342.             else
  343.             {
  344.                 if (root.Left == null || root.Right == null)
  345.                 {
  346.                     AVLNode temp = root.Left != null ? root.Left : root.Right;
  347.  
  348.                     // Узел с одним или без детей
  349.                     if (temp == null)
  350.                     {
  351.                         temp = root;
  352.                         root = null;
  353.                     }
  354.                     else
  355.                         root = temp;
  356.                 }
  357.                 else
  358.                 {
  359.                     // Узел с двумя детьми: получаем наименьший узел в правом поддереве
  360.                     AVLNode temp = MinValueNode(root.Right);
  361.  
  362.                     // Копируем данные наименьшего узла в текущий узел
  363.                     root.Value = temp.Value;
  364.  
  365.                     // Удаляем наименьший узел в правом поддереве
  366.                     root.Right = Delete(root.Right, temp.Value);
  367.                 }
  368.             }
  369.  
  370.             // Если дерево состоит только из одного узла, возвращаем его
  371.             if (root == null)
  372.                 return root;
  373.  
  374.             // Обновляем высоту текущего узла
  375.             UpdateHeight(root);
  376.  
  377.             // Получаем коэффициент балансировки текущего узла
  378.             int balance = BalanceFactor(root);
  379.  
  380.             // Перебалансировка дерева, если необходимо
  381.             if (balance > 1 && BalanceFactor(root.Left) >= 0)
  382.                 return RightRotate(root);
  383.  
  384.             if (balance < -1 && BalanceFactor(root.Right) <= 0)
  385.                 return LeftRotate(root);
  386.  
  387.             if (balance > 1 && BalanceFactor(root.Left) < 0)
  388.             {
  389.                 root.Left = LeftRotate(root.Left);
  390.                 return RightRotate(root);
  391.             }
  392.  
  393.             if (balance < -1 && BalanceFactor(root.Right) > 0)
  394.             {
  395.                 root.Right = RightRotate(root.Right);
  396.                 return LeftRotate(root);
  397.             }
  398.  
  399.             return root;
  400.         }
  401.  
  402.         private AVLNode MinValueNode(AVLNode node)
  403.         {
  404.             AVLNode current = node;
  405.             while (current.Left != null)
  406.                 current = current.Left;
  407.             return current;
  408.         }
  409.  
  410.         public void Delete(int key)
  411.         {
  412.             root = Delete(root, key);
  413.         }
  414.  
  415.         public bool Search(int key)
  416.         {
  417.             return Search(root, key);
  418.         }
  419.  
  420.         private bool Search(AVLNode node, int key)
  421.         {
  422.             if (node == null)
  423.                 return false;
  424.             if (key == node.Value)
  425.                 return true;
  426.             if (key < node.Value)
  427.                 return Search(node.Left, key);
  428.             else
  429.                 return Search(node.Right, key);
  430.         }
  431.  
  432.     }
  433.  
  434.     public class RedBlackTree
  435.     {
  436.         public enum Color { Red, Black }
  437.  
  438.         public class RBNode
  439.         {
  440.             public int Value;
  441.             public Color NodeColor;
  442.             public RBNode Left;
  443.             public RBNode Right;
  444.             public RBNode Parent;
  445.  
  446.             public RBNode(int value)
  447.             {
  448.                 Value = value;
  449.                 NodeColor = Color.Red;
  450.                 Left = null;
  451.                 Right = null;
  452.                 Parent = null;
  453.             }
  454.         }
  455.  
  456.         public RBNode root;
  457.         private Canvas canvas;
  458.  
  459.         public RedBlackTree(Canvas canvas)
  460.         {
  461.             root = null;
  462.             this.canvas = canvas;
  463.         }
  464.  
  465.         // Методы вставки, удаления и балансировки дерева будут здесь
  466.         public void Insert(int value)
  467.         {
  468.             root = Insert(root, null, value); // Начинаем с корня, у корня нет родителя
  469.                                               // Корень всегда должен быть черным, чтобы удовлетворить свойства красно-черного дерева
  470.             root.NodeColor = Color.Black;
  471.             Console.WriteLine($"Inserted node with value {value}");
  472.         }
  473.  
  474.         private RBNode Insert(RBNode node, RBNode parent, int value)
  475.         {
  476.             if (node == null)
  477.             {
  478.                 node = new RBNode(value);
  479.                 node.Parent = parent;
  480.                 return node;
  481.             }
  482.  
  483.             if (value < node.Value)
  484.                 node.Left = Insert(node.Left, node, value);
  485.             else if (value > node.Value)
  486.                 node.Right = Insert(node.Right, node, value);
  487.             else
  488.                 return node; // Значение уже существует в дереве, ничего не делаем
  489.  
  490.             // Проверяем и исправляем свойства красно-черного дерева
  491.             if (node.Parent != null && node.Parent.NodeColor == Color.Red)
  492.             {
  493.                 RBNode parentNode = node.Parent; // Изменено имя переменной
  494.                 RBNode grandparent = parentNode.Parent;
  495.                 RBNode uncle = grandparent.Left == parentNode ? grandparent.Right : grandparent.Left;
  496.  
  497.                 // Случай 1: Дядя красный
  498.                 if (uncle != null && uncle.NodeColor == Color.Red)
  499.                 {
  500.                     parentNode.NodeColor = Color.Black;
  501.                     uncle.NodeColor = Color.Black;
  502.                     grandparent.NodeColor = Color.Red;
  503.                     return Insert(grandparent, grandparent.Parent, node.Value); // Продолжаем проверку свойств с дедушкой
  504.                 }
  505.  
  506.                 // Случай 2: Дядя черный, текущий узел - правый потомок своего родителя
  507.                 if (parentNode.Right == node && grandparent.Left == parentNode)
  508.                 {
  509.                     parentNode = LeftRotate(parentNode);
  510.                     node = node.Left;
  511.                 }
  512.                 // Случай 3: Дядя черный, текущий узел - левый потомок своего родителя
  513.                 else if (parentNode.Left == node && grandparent.Right == parentNode)
  514.                 {
  515.                     parentNode = RightRotate(parentNode);
  516.                     node = node.Right;
  517.                 }
  518.  
  519.                 // Случай 4: Дядя черный, текущий узел - левый потомок своего родителя
  520.                 parentNode.NodeColor = Color.Black;
  521.                 grandparent.NodeColor = Color.Red;
  522.                 if (parentNode.Left == node && grandparent.Left == parentNode)
  523.                     grandparent = RightRotate(grandparent);
  524.                 else
  525.                     grandparent = LeftRotate(grandparent);
  526.             }
  527.  
  528.  
  529.             return node;
  530.         }
  531.  
  532.         public bool Search(int value)
  533.         {
  534.             return Search(root, value);
  535.         }
  536.  
  537.         private bool Search(RBNode node, int value)
  538.         {
  539.             if (node == null)
  540.                 return false;
  541.  
  542.             if (value == node.Value)
  543.                 return true;
  544.  
  545.             if (value < node.Value)
  546.                 return Search(node.Left, value);
  547.             else
  548.                 return Search(node.Right, value);
  549.         }
  550.  
  551.         public void Delete(int value)
  552.         {
  553.             root = Delete(root, value);
  554.         }
  555.  
  556.         private RBNode Delete(RBNode node, int value)
  557.         {
  558.             if (node == null)
  559.                 return null;
  560.  
  561.             if (value < node.Value)
  562.                 node.Left = Delete(node.Left, value);
  563.             else if (value > node.Value)
  564.                 node.Right = Delete(node.Right, value);
  565.             else
  566.             {
  567.                 // Найден узел для удаления
  568.                 if (node.Left == null)
  569.                     return node.Right;
  570.                 else if (node.Right == null)
  571.                     return node.Left;
  572.  
  573.                 // У узла есть оба потомка
  574.                 // Находим наименьший узел в правом поддереве (или наибольший в левом поддереве)
  575.                 RBNode minRight = FindMin(node.Right);
  576.                 // Копируем значение найденного узла в текущий узел
  577.                 node.Value = minRight.Value;
  578.                 // Рекурсивно удаляем найденный узел
  579.                 node.Right = Delete(node.Right, minRight.Value);
  580.             }
  581.  
  582.             // Проверяем и исправляем свойства красно-черного дерева после удаления узла
  583.             if (node.NodeColor == Color.Black)
  584.             {
  585.                 if (node.Left != null && node.Left.NodeColor == Color.Red)
  586.                     node.Left.NodeColor = Color.Black;
  587.                 else if (node.Right != null && node.Right.NodeColor == Color.Red)
  588.                     node.Right.NodeColor = Color.Black;
  589.                 else
  590.                     node = FixDoubleBlack(node);
  591.             }
  592.  
  593.             return node;
  594.         }
  595.  
  596.         // Вспомогательный метод для поиска наименьшего узла в дереве
  597.         private RBNode FindMin(RBNode node)
  598.         {
  599.             while (node.Left != null)
  600.                 node = node.Left;
  601.             return node;
  602.         }
  603.  
  604.         // Вспомогательный метод для исправления двойной черной высоты узла
  605.         private RBNode FixDoubleBlack(RBNode node)
  606.         {
  607.             if (node.Parent == null)
  608.                 return node;
  609.  
  610.             RBNode sibling = GetSibling(node);
  611.             RBNode parent = node.Parent;
  612.  
  613.             if (sibling == null)
  614.                 return FixDoubleBlack(parent);
  615.  
  616.             if (sibling.NodeColor == Color.Black)
  617.             {
  618.                 // Случай 1: Брат черный и у брата есть красный потомок
  619.                 if ((sibling.Left != null && sibling.Left.NodeColor == Color.Red) || (sibling.Right != null && sibling.Right.NodeColor == Color.Red))
  620.                 {
  621.                     if (sibling.Left != null && sibling.Left.NodeColor == Color.Red)
  622.                     {
  623.                         if (parent.Left == sibling)
  624.                         {
  625.                             sibling.Left.NodeColor = sibling.NodeColor;
  626.                             sibling.NodeColor = parent.NodeColor;
  627.                             RightRotate(parent);
  628.                         }
  629.                         else
  630.                         {
  631.                             sibling.Left.NodeColor = parent.NodeColor;
  632.                             RightRotate(sibling);
  633.                             LeftRotate(parent);
  634.                         }
  635.                     }
  636.                     else
  637.                     {
  638.                         if (parent.Left == sibling)
  639.                         {
  640.                             sibling.Right.NodeColor = parent.NodeColor;
  641.                             LeftRotate(sibling);
  642.                             RightRotate(parent);
  643.                         }
  644.                         else
  645.                         {
  646.                             sibling.Right.NodeColor = sibling.NodeColor;
  647.                             sibling.NodeColor = parent.NodeColor;
  648.                             LeftRotate(parent);
  649.                         }
  650.                     }
  651.                     parent.NodeColor = Color.Black;
  652.                 }
  653.                 // Случай 2: Брат черный и у брата нет красного потомка
  654.                 else
  655.                 {
  656.                     sibling.NodeColor = Color.Red;
  657.                     if (parent.NodeColor == Color.Black)
  658.                         return FixDoubleBlack(parent);
  659.                     else
  660.                         parent.NodeColor = Color.Black;
  661.                 }
  662.             }
  663.             // Случай 3: Брат красный
  664.             else
  665.             {
  666.                 if (parent.Left == sibling)
  667.                     RightRotate(parent);
  668.                 else
  669.                     LeftRotate(parent);
  670.                 parent.NodeColor = Color.Red;
  671.                 sibling.NodeColor = Color.Black;
  672.                 return FixDoubleBlack(node);
  673.             }
  674.  
  675.             return node;
  676.         }
  677.  
  678.         // Вспомогательный метод для получения брата узла
  679.         private RBNode GetSibling(RBNode node)
  680.         {
  681.             if (node.Parent == null)
  682.                 return null;
  683.  
  684.             if (node == node.Parent.Left)
  685.                 return node.Parent.Right;
  686.             else
  687.                 return node.Parent.Left;
  688.         }
  689.  
  690.         private RBNode LeftRotate(RBNode node)
  691.         {
  692.             RBNode newRoot = node.Right;
  693.             node.Right = newRoot.Left;
  694.             if (newRoot.Left != null)
  695.                 newRoot.Left.Parent = node;
  696.             newRoot.Parent = node.Parent;
  697.             if (node.Parent == null)
  698.                 root = newRoot;
  699.             else if (node == node.Parent.Left)
  700.                 node.Parent.Left = newRoot;
  701.             else
  702.                 node.Parent.Right = newRoot;
  703.             newRoot.Left = node;
  704.             node.Parent = newRoot;
  705.             return newRoot;
  706.         }
  707.  
  708.         private RBNode RightRotate(RBNode node)
  709.         {
  710.             RBNode newRoot = node.Left;
  711.             node.Left = newRoot.Right;
  712.             if (newRoot.Right != null)
  713.                 newRoot.Right.Parent = node;
  714.             newRoot.Parent = node.Parent;
  715.             if (node.Parent == null)
  716.                 root = newRoot;
  717.             else if (node == node.Parent.Right)
  718.                 node.Parent.Right = newRoot;
  719.             else
  720.                 node.Parent.Left = newRoot;
  721.             newRoot.Right = node;
  722.             node.Parent = newRoot;
  723.             return newRoot;
  724.         }
  725.  
  726.     }
  727.  
  728.     /// <summary>
  729.     /// Логика взаимодействия для MainWindow.xaml
  730.     /// </summary>
  731.     public partial class MainWindow : Window
  732.     {
  733.         private TreeManager treeManager;
  734.         private TreeDrawer treeDrawer;
  735.  
  736.         private TreeManager binarySearchTreeManager;
  737.         private TreeManager avlTreeManager;
  738.         private TreeManager redBlackTreeManager;
  739.  
  740.         private TreeDrawer binarySearchTreeDrawer;
  741.         private TreeDrawer avlTreeDrawer;
  742.         private TreeDrawer redBlackTreeDrawer;
  743.  
  744.         public MainWindow()
  745.         {
  746.             InitializeComponent();
  747.             treeManager = new TreeManager(canvas);
  748.             treeDrawer = new TreeDrawer(canvas);
  749.  
  750.             binarySearchTreeManager = new TreeManager(BSTcanvas);
  751.             avlTreeManager = new TreeManager(AVLcanvas);
  752.             redBlackTreeManager = new TreeManager(RBcanvas);
  753.  
  754.             binarySearchTreeDrawer = new TreeDrawer(BSTcanvas);
  755.             avlTreeDrawer = new TreeDrawer(AVLcanvas);
  756.             redBlackTreeDrawer = new TreeDrawer(RBcanvas);
  757.         }
  758.  
  759.         private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
  760.         {
  761.             TextBox textBox = (TextBox)sender;
  762.             if (string.IsNullOrEmpty(textBox.Text))
  763.             {
  764.                 textBox.Foreground = Brushes.LightGray;
  765.             }
  766.             else
  767.             {
  768.                 textBox.Foreground = Brushes.Black;
  769.             }
  770.         }
  771.  
  772.         private void TreeTypeComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
  773.         {
  774.             canvas.Children.Clear();
  775.  
  776.             ComboBox comboBox = (ComboBox)sender;
  777.             TreeType selectedTree = (TreeType)comboBox.SelectedIndex;
  778.  
  779.             UpdateTreeDrawing(selectedTree);
  780.         }
  781.  
  782.         private void AddButton_Click(object sender, RoutedEventArgs e)
  783.         {
  784.             if (!string.IsNullOrEmpty(nodeInputTextBox.Text))
  785.             {
  786.                 int value = int.Parse(nodeInputTextBox.Text); // Извлечение значения из поля ввода
  787.                 TreeType selectedTree = (TreeType)TreeTypeComboBox.SelectedIndex;
  788.                 treeManager.Insert(value, selectedTree);
  789.                 UpdateTreeDrawing(selectedTree);
  790.             }
  791.         }
  792.  
  793.         private void DeleteButton_Click(object sender, RoutedEventArgs e)
  794.         {
  795.             if (!string.IsNullOrEmpty(nodeInputTextBox.Text))
  796.             {
  797.                 int value = int.Parse(nodeInputTextBox.Text);
  798.                 TreeType selectedTree = (TreeType)TreeTypeComboBox.SelectedIndex;
  799.                 treeManager.Delete(value, selectedTree);
  800.                 UpdateTreeDrawing(selectedTree);
  801.             }
  802.         }
  803.  
  804.         private void SearchButton_Click(object sender, RoutedEventArgs e)
  805.         {
  806.             if (!string.IsNullOrEmpty(nodeInputTextBox.Text))
  807.             {
  808.                 int value = int.Parse(nodeInputTextBox.Text);
  809.                 TreeType selectedTree = (TreeType)TreeTypeComboBox.SelectedIndex;
  810.                 bool found = treeManager.Search(value, selectedTree);
  811.  
  812.                 if (found)
  813.                 {
  814.                     MessageBox.Show($"Узел со значением {value} найден в дереве.", "Результат поиска", MessageBoxButton.OK, MessageBoxImage.Information);
  815.                 }
  816.                 else
  817.                 {
  818.                     MessageBox.Show($"Узел со значением {value} не найден в дереве.", "Результат поиска", MessageBoxButton.OK, MessageBoxImage.Information);
  819.                 }
  820.             }
  821.         }
  822.  
  823.         private void UpdateTreeDrawing(TreeType treeType)
  824.         {
  825.             switch (treeType)
  826.             {
  827.                 case TreeType.BinarySearchTree:
  828.                     if (MainTabControl.SelectedItem == BSTree)
  829.                     {
  830.                         treeDrawer.DrawBinarySearchTree(treeManager.binarySearchTree.root, BSTcanvas);
  831.                     }
  832.                     break;
  833.                 case TreeType.AVLTree:
  834.                     if (MainTabControl.SelectedItem == AVLtree)
  835.                     {
  836.                         treeDrawer.DrawAVLTree(treeManager.avlTree.root, AVLcanvas);
  837.                     }
  838.                     break;
  839.                 case TreeType.RedBlackTree:
  840.                     if (MainTabControl.SelectedItem == RBtree)
  841.                     {
  842.                         treeDrawer.DrawRedBlackTree(treeManager.redBlackTree.root, RBcanvas);
  843.                     }
  844.                     break;
  845.             }
  846.         }
  847.  
  848.  
  849.         private void UpdateTreeDrawingTabItem(TreeType treeType)
  850.         {
  851.             switch (treeType)
  852.             {
  853.                 case TreeType.BinarySearchTree:
  854.                     if (MainTabControl.SelectedItem == BSTree)
  855.                     {
  856.                         treeDrawer.DrawBinarySearchTree(treeManager.binarySearchTree.root, BSTcanvas);
  857.                     }
  858.                     break;
  859.                 case TreeType.AVLTree:
  860.                     if (MainTabControl.SelectedItem == AVLtree)
  861.                     {
  862.                         treeDrawer.DrawAVLTree(treeManager.avlTree.root, AVLcanvas);
  863.                     }
  864.                     break;
  865.                 case TreeType.RedBlackTree:
  866.                     if (MainTabControl.SelectedItem == RBtree)
  867.                     {
  868.                         treeDrawer.DrawRedBlackTree(treeManager.redBlackTree.root, RBcanvas);
  869.                     }
  870.                     break;
  871.             }
  872.         }
  873.  
  874.  
  875.  
  876.         private void TreesButton_Click(object sender, RoutedEventArgs e)
  877.         {
  878.             TabControl mainTabControl = this.MainTabControl;
  879.             if (mainTabControl != null)
  880.             {
  881.                 mainTabControl.SelectedItem = mainTabControl.Items.OfType<TabItem>().FirstOrDefault(t => t.Name == "TreeSelectionMenu");
  882.             }
  883.         }
  884.  
  885.         private void SettingsButton_Click(object sender, RoutedEventArgs e)
  886.         {
  887.             TabControl mainTabControl = this.MainTabControl;
  888.             if (mainTabControl != null)
  889.             {
  890.                 mainTabControl.SelectedItem = mainTabControl.Items.OfType<TabItem>().FirstOrDefault(t => t.Name == "Settings");
  891.             }
  892.         }
  893.  
  894.         private void ExitButton_Click(object sender, RoutedEventArgs e)
  895.         {
  896.             Application.Current.Shutdown();
  897.         }
  898.  
  899.         private void BSTreeButton_Click(object sender, RoutedEventArgs e)
  900.         {
  901.             MainTabControl.SelectedItem = BSTree;
  902.             UpdateTreeDrawingTabItem(TreeType.BinarySearchTree);
  903.         }
  904.  
  905.         private void AVLtreeButton_Click(object sender, RoutedEventArgs e)
  906.         {
  907.             MainTabControl.SelectedItem = AVLtree;
  908.             treeDrawer.DrawAVLTree(treeManager.avlTree.root, AVLcanvas);
  909.         }
  910.  
  911.         private void RBtreeButton_Click(object sender, RoutedEventArgs e)
  912.         {
  913.             MainTabControl.SelectedItem = RBtree;
  914.             treeDrawer.DrawRedBlackTree(treeManager.redBlackTree.root, RBcanvas);
  915.         }
  916.  
  917.         private void BackToMenuButton_Click(object sender, RoutedEventArgs e)
  918.         {
  919.             MainTabControl.SelectedItem = StartUpMenu;
  920.         }
  921.  
  922.         private void BSTreeAdd_Click(object sender, RoutedEventArgs e)
  923.         {
  924.             if (!string.IsNullOrEmpty(BSTnodeInputTextBox.Text))
  925.             {
  926.                 int value = int.Parse(BSTnodeInputTextBox.Text);
  927.                 treeManager.Insert(value, TreeType.BinarySearchTree);
  928.                 UpdateTreeDrawingTabItem(TreeType.BinarySearchTree);
  929.             }
  930.         }
  931.  
  932.         private void BSTreeDelete_Click(object sender, RoutedEventArgs e)
  933.         {
  934.             if (!string.IsNullOrEmpty(BSTnodeInputTextBox.Text))
  935.             {
  936.                 int value = int.Parse(BSTnodeInputTextBox.Text);
  937.                 treeManager.Delete(value, TreeType.BinarySearchTree);
  938.                 UpdateTreeDrawingTabItem(TreeType.BinarySearchTree);
  939.             }
  940.         }
  941.  
  942.         private void BStreeSearch_Click(object sender, RoutedEventArgs e)
  943.         {
  944.             if (!string.IsNullOrEmpty(BSTnodeInputTextBox.Text))
  945.             {
  946.                 int value = int.Parse(BSTnodeInputTextBox.Text);
  947.                 bool found = treeManager.Search(value, TreeType.BinarySearchTree);
  948.  
  949.                 if (found)
  950.                 {
  951.                     MessageBox.Show($"Узел со значением {value} найден в бинарном дереве поиска.", "Результат поиска", MessageBoxButton.OK, MessageBoxImage.Information);
  952.                 }
  953.                 else
  954.                 {
  955.                     MessageBox.Show($"Узел со значением {value} не найден в бинарном дереве поиска.", "Результат поиска", MessageBoxButton.OK, MessageBoxImage.Information);
  956.                 }
  957.             }
  958.         }
  959.  
  960.         private void RBreeAdd_Click(object sender, RoutedEventArgs e)
  961.         {
  962.             if (!string.IsNullOrEmpty(RBnodeInputTextBox.Text))
  963.             {
  964.                 int value = int.Parse(RBnodeInputTextBox.Text);
  965.                 treeManager.Insert(value, TreeType.RedBlackTree);
  966.                 UpdateTreeDrawingTabItem(TreeType.RedBlackTree);
  967.             }
  968.         }
  969.  
  970.         private void RBreeDelete_Click(object sender, RoutedEventArgs e)
  971.         {
  972.             if (!string.IsNullOrEmpty(RBnodeInputTextBox.Text))
  973.             {
  974.                 int value = int.Parse(RBnodeInputTextBox.Text);
  975.                 treeManager.Delete(value, TreeType.RedBlackTree);
  976.                 UpdateTreeDrawingTabItem(TreeType.RedBlackTree);
  977.             }
  978.         }
  979.  
  980.         private void RBtreeSearch_Click(object sender, RoutedEventArgs e)
  981.         {
  982.             if (!string.IsNullOrEmpty(RBnodeInputTextBox.Text))
  983.             {
  984.                 int value = int.Parse(RBnodeInputTextBox.Text);
  985.                 bool found = treeManager.Search(value, TreeType.RedBlackTree);
  986.  
  987.                 if (found)
  988.                 {
  989.                     MessageBox.Show($"Узел со значением {value} найден в КЧ-дереве.", "Результат поиска", MessageBoxButton.OK, MessageBoxImage.Information);
  990.                 }
  991.                 else
  992.                 {
  993.                     MessageBox.Show($"Узел со значением {value} не найден в КЧ-дереве.", "Результат поиска", MessageBoxButton.OK, MessageBoxImage.Information);
  994.                 }
  995.             }
  996.         }
  997.  
  998.         private void AVLtreeAdd_Click(object sender, RoutedEventArgs e)
  999.         {
  1000.             if (!string.IsNullOrEmpty(AVLnodeInputTextBox.Text))
  1001.             {
  1002.                 int value = int.Parse(AVLnodeInputTextBox.Text);
  1003.                 treeManager.Insert(value, TreeType.AVLTree);
  1004.                 UpdateTreeDrawingTabItem(TreeType.AVLTree);
  1005.             }
  1006.         }
  1007.  
  1008.         private void AVLtreeDelete_Click(object sender, RoutedEventArgs e)
  1009.         {
  1010.             if (!string.IsNullOrEmpty(AVLnodeInputTextBox.Text))
  1011.             {
  1012.                 int value = int.Parse(AVLnodeInputTextBox.Text);
  1013.                 treeManager.Delete(value, TreeType.AVLTree);
  1014.                 UpdateTreeDrawingTabItem(TreeType.AVLTree);
  1015.             }
  1016.         }
  1017.  
  1018.         private void AVLtreeSearch_Click(object sender, RoutedEventArgs e)
  1019.         {
  1020.             if (!string.IsNullOrEmpty(AVLnodeInputTextBox.Text))
  1021.             {
  1022.                 int value = int.Parse(AVLnodeInputTextBox.Text);
  1023.                 bool found = treeManager.Search(value, TreeType.AVLTree);
  1024.  
  1025.                 if (found)
  1026.                 {
  1027.                     MessageBox.Show($"Узел со значением {value} найден в AVL-дереве.", "Результат поиска", MessageBoxButton.OK, MessageBoxImage.Information);
  1028.                 }
  1029.                 else
  1030.                 {
  1031.                     MessageBox.Show($"Узел со значением {value} не найден в AVL-дереве.", "Результат поиска", MessageBoxButton.OK, MessageBoxImage.Information);
  1032.                 }
  1033.             }
  1034.         }
  1035.     }
  1036.  
  1037. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement