Advertisement
m1okgoodyes

BinaryTree2

Apr 6th, 2022
910
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.04 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. namespace Trees
  4. {
  5.     internal class Program
  6.     {
  7.  
  8.    
  9.         static void Main(string[] args)
  10.         {
  11.             //Создадим дерево с корневым элементом 33
  12.             BinaryTree<int> tree = new BinaryTree<int>(33, null);
  13.             struct collections { 5, 35, 1, 20, 4, 17, 31, 99, 18, 19};
  14.             //Распечатаем элементы дерева
  15.             tree.print();
  16.             //Удалим корень
  17.             tree.remove(33);
  18.             tree.remove(17);
  19.             tree.print();
  20.             //Проверяем элементы дерева
  21.             Console.WriteLine(tree);
  22.             Console.WriteLine(tree.left());
  23.             Console.WriteLine(tree.left().left());
  24.             Console.WriteLine(tree.right().left());
  25.         }
  26.         public class BinaryTree<T> where T : IComparable<T>
  27.         {
  28.             private BinaryTree<T> parent, left, right;
  29.             private T val;
  30.             private List<T> listForPrint = new List<T>();
  31.  
  32.             public BinaryTree(T val, BinaryTree<T> parent)
  33.             {
  34.                 this.val = val;
  35.                 this.parent = parent;
  36.             }
  37.  
  38.             public void add(T val)
  39.             {
  40.                 if (val.CompareTo(this.val) < 0)
  41.                 {
  42.                     if (this.left == null)
  43.                     {
  44.                         this.left = new BinaryTree<T>(val, this);
  45.                     }
  46.                     else if (this.left != null)
  47.                         this.left.add(val);
  48.                 }
  49.                 else
  50.                 {
  51.                     if (this.right == null)
  52.                     {
  53.                     this.right = new BinaryTree<T>(val, this);
  54.                     }
  55.                     else if (this.right != null)
  56.                         this.right.add(val);
  57.                 }
  58.             }
  59.  
  60.             private BinaryTree<T> Search(BinaryTree<T> tree, T val)
  61.             {
  62.                 if (tree == null) return null;
  63.                 switch (val.CompareTo(tree.val))
  64.                 {
  65.                     case 1: return Search(tree.right, val);
  66.                     case -1: return Search(tree.left, val);
  67.                     case 0: return tree;
  68.                     default: return null;
  69.                 }
  70.             }
  71.  
  72.             public bool remove(T val)
  73.             {
  74.                 //Проверяем, существует ли данный узел
  75.                 BinaryTree<T> tree = Search(this, val);
  76.                 if (tree == null)
  77.                 {
  78.                     //Если узла не существует, вернем false
  79.                     return false;
  80.                 }
  81.                 BinaryTree<T> curTree;
  82.  
  83.                 //Если удаляем корень
  84.                 if (tree == this)
  85.                 {
  86.                     if (tree.right != null)
  87.                     {
  88.                         curTree = tree.right;
  89.                     }
  90.                     else curTree = tree.left;
  91.  
  92.                     while (curTree.left != null)
  93.                     {
  94.                         curTree = curTree.left;
  95.                     }
  96.                     T temp = curTree.val;
  97.                     this.remove(temp);
  98.                     tree.val = temp;
  99.  
  100.                     return true;
  101.                 }
  102.  
  103.                 //Удаление листьев
  104.                 if (tree.left == null && tree.right == null && tree.parent != null)
  105.                 {
  106.                     if (tree == tree.parent.left)
  107.                         tree.parent.left = null;
  108.                     else
  109.                     {
  110.                         tree.parent.right = null;
  111.                     }
  112.                     return true;
  113.                 }
  114.  
  115.                 //Удаление узла, имеющего левое поддерево, но не имеющее правого поддерева
  116.                 if (tree.left != null && tree.right == null)
  117.                 {
  118.                     //Меняем родителя
  119.                     tree.left.parent = tree.parent;
  120.                     if (tree == tree.parent.left)
  121.                     {
  122.                         tree.parent.left = tree.left;
  123.                     }
  124.                     else if (tree == tree.parent.right)
  125.                     {
  126.                         tree.parent.right = tree.left;
  127.                     }
  128.                     return true;
  129.                 }
  130.  
  131.                 //Удаление узла, имеющего правое поддерево, но не имеющее левого поддерева
  132.                 if (tree.left == null && tree.right != null)
  133.                 {
  134.                     //Меняем родителя
  135.                     tree.right.parent = tree.parent;
  136.                     if (tree == tree.parent.left)
  137.                     {
  138.                         tree.parent.left = tree.right;
  139.                     }
  140.                     else if (tree == tree.parent.right)
  141.                     {
  142.                         tree.parent.right = tree.right;
  143.                     }
  144.                     return true;
  145.                 }
  146.  
  147.                 //Удаляем узел, имеющий поддеревья с обеих сторон
  148.                 if (tree.right != null && tree.left != null)
  149.                 {
  150.                     curTree = tree.right;
  151.  
  152.                     while (curTree.left != null)
  153.                     {
  154.                         curTree = curTree.left;
  155.                     }
  156.  
  157.                     //Если самый левый элемент является первым потомком
  158.                     if (curTree.parent == tree)
  159.                     {
  160.                         curTree.left = tree.left;
  161.                         tree.left.parent = curTree;
  162.                         curTree.parent = tree.parent;
  163.                         if (tree == tree.parent.left)
  164.                         {
  165.                             tree.parent.left = curTree;
  166.                         }
  167.                         else if (tree == tree.parent.right)
  168.                         {
  169.                             tree.parent.right = curTree;
  170.                         }
  171.                         return true;
  172.                     }
  173.                     //Если самый левый элемент НЕ является первым потомком
  174.                     else
  175.                     {
  176.                         if (curTree.right != null)
  177.                         {
  178.                             curTree.right.parent = curTree.parent;
  179.                         }
  180.                         curTree.parent.left = curTree.right;
  181.                         curTree.right = tree.right;
  182.                         curTree.left = tree.left;
  183.                         tree.left.parent = curTree;
  184.                         tree.right.parent = curTree;
  185.                         curTree.parent = tree.parent;
  186.                         if (tree == tree.parent.left)
  187.                         {
  188.                             tree.parent.left = curTree;
  189.                         }
  190.                         else if (tree == tree.parent.right)
  191.                         {
  192.                             tree.parent.right = curTree;
  193.                         }
  194.  
  195.                         return true;
  196.                     }
  197.                 }
  198.                 return false;
  199.             }
  200.  
  201.             private void _print(BinaryTree<T> node)
  202.             {
  203.                 if (node == null) return;
  204.                 _print(node.left);
  205.                 listForPrint.Add(node.val);
  206.                 Console.Write(node + " ");
  207.                 if (node.right != null)
  208.                     _print(node.right);
  209.             }
  210.             public void print()
  211.             {
  212.                 listForPrint.Clear();
  213.                 _print(this);
  214.                 Console.WriteLine();
  215.             }
  216.  
  217.             public override string ToString()
  218.             {
  219.                 return val.ToString();
  220.             }
  221.         }
  222.     }
  223. }
  224.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement