Seal_of_approval

Pr15R3

May 19th, 2016
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.37 KB | None | 0 0
  1. Program.cs____________________
  2.  
  3. using System;
  4. using System.IO;
  5.  
  6. namespace test
  7. {
  8.     class Program
  9.     {
  10.         static BinaryTree myTree = new BinaryTree ();
  11.  
  12.         public static void Main (string[] args)
  13.         {
  14.             string[] content = File.ReadAllLines (@"../../input.txt");
  15.  
  16.             foreach (string line in content)
  17.             {
  18.                 string[] data = line.Split (' ');
  19.                 myTree.Add (new Subscriber(int.Parse (data [0]), data [1], data [2], data [3]));
  20.             }
  21.  
  22.             ShowTree ();
  23.  
  24.         }
  25.  
  26.         private static void ShowTree()
  27.         {
  28.             foreach (Subscriber subscriber in myTree.GetData(false))
  29.             {
  30.                 Console.Write("{0} {1} {2} {3} ", subscriber.Id, subscriber.Name, subscriber.Number, subscriber.Tariff);
  31.                 Console.WriteLine();
  32.             }
  33.         }
  34.     }
  35. }
  36.  
  37. BinaryTree.cs_______________________
  38. using System.Linq;
  39.  
  40. namespace test
  41. {
  42.     class BinaryTree
  43.     {
  44.         private Node root;
  45.  
  46.         public class Node
  47.         {
  48.             public Subscriber subscriber;
  49.             public Node left;
  50.             public Node right;
  51.             public int children;
  52.  
  53.             public Node(Subscriber subscriber)
  54.             {
  55.                 this.subscriber = subscriber;
  56.                 this.left = null;
  57.                 this.right = null;
  58.                 this.children = 1;
  59.             }
  60.         }
  61.  
  62.         public BinaryTree()
  63.         {
  64.             this.root = null;
  65.         }
  66.  
  67.         public void Add(Subscriber subscriber)
  68.         {
  69.             Add(ref root, subscriber);
  70.             Balancer();
  71.         }
  72.  
  73.         private void Add(ref Node node, Subscriber newCome)
  74.         {
  75.             if (node == null)
  76.             {
  77.                 node = new Node(newCome);
  78.             }
  79.             else
  80.             {
  81.                 node.children++;
  82.                 if (node.subscriber.Id > newCome.Id)
  83.                 {
  84.                     Add(ref node.left, newCome);
  85.                 }
  86.                 else
  87.                 {
  88.                     Add(ref node.right, newCome);
  89.                 }
  90.             }
  91.         }
  92.  
  93.         private int CalcChildren(ref Node node)
  94.         {
  95.             if (node != null)
  96.             {
  97.                 node.children = CalcChildren(ref node.left) + CalcChildren(ref node.right) + 1;
  98.                 return node.children;
  99.             }
  100.             else
  101.             {
  102.                 return 0;
  103.             }
  104.         }
  105.  
  106.         public void Delete(int id)
  107.         {
  108.             Delete(ref root, id);
  109.             Balancer(ref root);
  110.             CalcChildren(ref root);
  111.         }
  112.  
  113.         private void Delete(ref Node node, int id)
  114.         {
  115.             if (node != null)
  116.             {
  117.                 if (node.subscriber.Id > id)
  118.                 {
  119.                     Delete(ref node.left, id);
  120.                 }
  121.                 else if (node.subscriber.Id < id)
  122.                 {
  123.                     Delete(ref node.right, id);
  124.                 }
  125.                 else
  126.                 {
  127.                     if (node.left == null)
  128.                     {
  129.                         node = node.right;
  130.                     }
  131.                     else if (node.right == null)
  132.                     {
  133.                         node = node.left;
  134.                     }
  135.                     else
  136.                     {
  137.                         Node tmp = node.left;
  138.                         Delete(node, ref tmp);
  139.                     }
  140.                 }
  141.             }
  142.         }
  143.  
  144.         private void Delete(Node node, ref Node tmp)
  145.         {
  146.             if (tmp.right != null)
  147.             {
  148.                 Delete(node, ref tmp.right);
  149.             }
  150.             else
  151.             {
  152.                 node.subscriber.Id = tmp.subscriber.Id;
  153.                 tmp = tmp.left;
  154.             }
  155.         }
  156.  
  157.         public void Balancer()
  158.         {
  159.             Balancer(ref root);
  160.         }
  161.  
  162.         private void Balancer(ref Node node)
  163.         {
  164.             if (node == null || node.children == 1)
  165.                 return;
  166.  
  167.  
  168.             //Console.WriteLine(node == null);
  169.  
  170.             Part(ref node, node.children / 2);
  171.  
  172.             Balancer(ref node.left);
  173.             Balancer(ref node.right);
  174.         }
  175.  
  176.         private void Part(ref Node node, int index)
  177.         {
  178.  
  179.             int left = (node.left == null) ? 0 : node.left.children;
  180.             if (left > index)
  181.             {
  182.                 Part(ref node.left, index);
  183.                 RotationRight(ref node);
  184.             }
  185.             if (left < index)
  186.             {
  187.                 Part(ref node.right, index - left - 1);
  188.                 RotationLeft(ref node);
  189.             }
  190.         }
  191.  
  192.         private void RotationRight(ref Node node)
  193.         {
  194.             Node tmp = node.left;
  195.             node.left = tmp.right;
  196.             tmp.right = node;
  197.  
  198.             Count(ref node);
  199.             Count(ref tmp);
  200.  
  201.             node = tmp;
  202.         }
  203.  
  204.         private void RotationLeft(ref Node node)
  205.         {
  206.             Node tmp = node.right;
  207.             node.right = tmp.left;
  208.             tmp.left = node;
  209.  
  210.             Count(ref node);
  211.             Count(ref tmp);
  212.  
  213.             node = tmp;
  214.         }
  215.  
  216.         public void Count(ref Node node)
  217.         {
  218.             node.children = 1;
  219.  
  220.             if (node.left != null)
  221.             {
  222.                 node.children += node.left.children;
  223.             }
  224.  
  225.             if (node.right != null)
  226.             {
  227.                 node.children += node.right.children;
  228.             }
  229.         }
  230.  
  231.  
  232.         public bool IsBalanced()
  233.         {
  234.             bool answer = true;
  235.             IsBalanced(ref root, ref answer);
  236.             return answer;
  237.         }
  238.  
  239.         private void IsBalanced(ref Node node, ref bool answer)
  240.         {
  241.             if (node != null)
  242.             {
  243.                 int left = (node.left != null)   ? node.left.children  : 0;
  244.                 int right = (node.right != null) ? node.right.children : 0;
  245.  
  246.                 if (Math.Abs(left - right) > 1)
  247.                 {
  248.                     answer = false;
  249.                 }
  250.                 IsBalanced(ref node.left, ref answer);
  251.                 IsBalanced(ref node.right, ref answer);
  252.             }
  253.         }
  254.  
  255.         public List<Subscriber> GetData(bool sorted)
  256.         {
  257.             List<Subscriber> list = new List<Subscriber>();
  258.             if (sorted)
  259.             {
  260.                 GetSortedData(ref root, ref list);            
  261.             }
  262.             else
  263.             {
  264.                 GetData(ref root, ref list);            
  265.             }
  266.             return list;
  267.         }
  268.  
  269.         private void GetSortedData(ref Node node, ref List<Subscriber> list)
  270.         {
  271.             if (node != null)
  272.             {
  273.                 GetSortedData(ref node.left, ref list);
  274.  
  275.                 list.Add(node.subscriber);
  276.  
  277.                 GetSortedData(ref node.right, ref list);
  278.             }
  279.         }
  280.  
  281.         private void GetData(ref Node node, ref List<Subscriber> list)
  282.         {
  283.             if (node != null)
  284.             {
  285.                 list.Add(node.subscriber);
  286.  
  287.                 GetData(ref node.left, ref list);
  288.  
  289.                 GetData(ref node.right, ref list);
  290.             }
  291.         }
  292.  
  293.         public Subscriber findByNumber(String number)
  294.         {
  295.             Subscriber subscriber = null;
  296.  
  297.             findByNumber(ref root, ref subscriber, number);
  298.  
  299.             return subscriber;
  300.         }
  301.  
  302.         private void findByNumber(ref Node node, ref Subscriber subscriber, String number)
  303.         {
  304.             if (node != null)
  305.             {
  306.                 if (node.subscriber.Number.Equals(number))
  307.                 {
  308.                     subscriber = node.subscriber;
  309.                 }
  310.  
  311.                 findByNumber(ref node.left, ref subscriber, number);
  312.                 findByNumber(ref node.right, ref subscriber, number);
  313.             }
  314.         }
  315.  
  316.         public String getMostPopularTariff()
  317.         {
  318.             List<String> list = new List<string>();
  319.  
  320.             getMostPopularTariff(ref root, ref list);
  321.  
  322.             return list.GroupBy(str => str).OrderByDescending(str => str.Count()).FirstOrDefault().Key;
  323.         }
  324.  
  325.         private void getMostPopularTariff(ref Node node, ref List<String> list)
  326.         {
  327.             if (node != null)
  328.             {
  329.                 list.Add(node.subscriber.Tariff);
  330.  
  331.                 getMostPopularTariff(ref node.left, ref list);
  332.                 getMostPopularTariff(ref node.right, ref list);
  333.             }
  334.         }
  335.  
  336.         public int getMaxId()
  337.         {
  338.             int max = int.MinValue;
  339.  
  340.             getMaxId(ref root, ref max);
  341.  
  342.             return max;
  343.         }
  344.  
  345.         private void getMaxId(ref Node node, ref int max)
  346.         {
  347.             if (node != null)
  348.             {
  349.                 max = Math.Max(max, node.subscriber.Id);
  350.  
  351.                 getMaxId(ref node.left, ref max);
  352.                 getMaxId(ref node.right, ref max);
  353.             }
  354.         }
  355.     }
  356. }
  357.  
  358.  
  359. Subscriber.cs____________________________________________________
  360. using System;
  361. using System.Collections.Generic;
  362. using System.Linq;
  363. using System.Text;
  364. using System.Threading.Tasks;
  365.  
  366. namespace test
  367. {
  368.     class Subscriber
  369.     {
  370.         private int id;
  371.         private String number;
  372.         private String name;
  373.         private String tariff;
  374.  
  375.         public Subscriber()
  376.         { }
  377.  
  378.         public Subscriber(int id, String number, String name, String tariff)
  379.         {
  380.             this.id = id;
  381.             this.number = number;
  382.             this.name = name;
  383.             this.tariff = tariff;
  384.         }
  385.  
  386.         public int Id
  387.         {
  388.             get { return id; }
  389.             set { id = value; }
  390.         }
  391.  
  392.         public String Number
  393.         {
  394.             get { return number; }
  395.             set { number = value; }
  396.         }
  397.  
  398.         public String Name
  399.         {
  400.             get { return name; }
  401.             set { name = value; }
  402.         }
  403.  
  404.         public String Tariff
  405.         {
  406.             get { return tariff; }
  407.             set { tariff = value; }
  408.         }
  409.     }
  410. }
Advertisement
Add Comment
Please, Sign In to add comment