Advertisement
alexpeevk9

BST

May 9th, 2021 (edited)
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.22 KB | None | 0 0
  1. //1. За да разберем дали елементът вече съществува, използваме методът Search. Той връща стойност True при същестувавенто на такъв елемент. В двата метода рекурсивен и нерекурсивен, добавяме проверка !Search(root,v) в случаите в които се добавя отляво или отдясно. В Source кодът няма нерекурсивен метод за търсачка и заради това и в двата метода използвам Search методът.
  2.  
  3.         //рекурсивна реализация на добавяне на елемент        
  4.         public void Add(ref Node root, int v)
  5.         {
  6.             if (root == null)
  7.             {
  8.                 root = new Node();
  9.                 root.value = v;
  10.             }
  11.             else if (v < root.value)
  12.             {
  13.                 if(!Search(root,v))
  14.                 {
  15.                     Add(ref root.left, v);
  16.                 }
  17.                 else
  18.                 {
  19.                     Console.WriteLine($"The value {v} already exists!");
  20.                 }
  21.             }
  22.             else
  23.             {
  24.                 if (!Search(root, v))
  25.                 {
  26.                     Add(ref root.right, v);
  27.                 }
  28.                 else
  29.                 {
  30.                     Console.WriteLine($"The value {v} already exists!");
  31.                 }
  32.             }
  33.         }
  34.  
  35.         //нерекурсивна реализация на добавяне на елемент        
  36.         public void AddNR(ref Node root, int v)
  37.         {
  38.             if (root == null)
  39.             {
  40.                 root = new Node();
  41.                 root.value = v;
  42.             }
  43.             else
  44.             {
  45.                 Node newNode = new Node();
  46.                 newNode.value = v;
  47.                 Node prior = root;
  48.                 Node next;
  49.                 if (v < root.value)
  50.                 {
  51.                     if (Search(root, v))
  52.                     {
  53.                         Console.WriteLine($"The value {v} exists!");
  54.                         return;
  55.                     }
  56.                     next = root.left;
  57.                 }
  58.                 else
  59.                 {
  60.                     if (Search(root, v))
  61.                     {
  62.                         Console.WriteLine($"The value {v} exists!");
  63.                         return;
  64.                     }
  65.                     next = root.right;
  66.                 }
  67.                 while (next != null)
  68.                 {
  69.                     prior = next;
  70.                     if (v < prior.value)
  71.                         next = prior.left;
  72.                     else
  73.                         next = prior.right;
  74.                 }
  75.                 if (v < prior.value)
  76.                     prior.left = newNode;
  77.                 else
  78.                     prior.right = newNode;
  79.             }
  80.         }
  81.  
  82.  
  83. // Задача 2
  84.          
  85.         public static bool SearchNodeNR(Node root, int key)
  86.         {
  87.             Node parent; // Променлива която да сочи към родител на даденият нод
  88.            
  89.             Node curr = root; // Започваме със началният нод
  90.  
  91.             while (curr != null && curr.value != key)
  92.             {
  93.                 parent = curr; // Всеки път задаваме стойността на новият родител за даденият нод
  94.  
  95.                 if (key < curr.value)
  96.                 {
  97.                     curr = curr.left;
  98.                 }
  99.                 else
  100.                 {
  101.                     curr = curr.right;
  102.                 }
  103.             }
  104.             return curr != null;
  105.         }
  106.  
  107. // Алтернативен нерекурсивен начин за намиране (По-дълъг)
  108. public bool SearchNR(Node root, int key)
  109.         {
  110.             Node searchNode = new Node();
  111.             searchNode.value = key;
  112.             Node prior = root;
  113.             Node next;
  114.             if (key < root.value)
  115.             {
  116.                 next = root.left;
  117.             }
  118.             else
  119.             {
  120.                 next = root.right;
  121.             }
  122.             while (next != null)
  123.             {
  124.                 prior = next;
  125.                 if (key < prior.value)
  126.                     next = prior.left;
  127.                 else
  128.                     next = prior.right;
  129.  
  130.             }
  131.             if(key == prior.value)
  132.             {
  133.                 return prior.left == searchNode;
  134.             }
  135.             else
  136.             {
  137.                 return prior.right == searchNode;
  138.             }
  139.         }
  140.  
  141. // Задача 3 - Използва се търсачка от 2ра задача (Но там методът е булев) След извикването на метода RemoveNode, в main трябва да се извика методът Traverse, за да видим резултатът.
  142.            
  143. public static Node RemoveNode(Node root, int key)
  144.         {
  145.             Node parent = null;
  146.             Node curr = root;
  147.             while (curr != null && curr.value != key)
  148.             {
  149.                 parent = curr;
  150.                 if (key < curr.value)
  151.                 {
  152.                     curr = curr.left;
  153.                 }
  154.                 else
  155.                 {
  156.                     curr = curr.right;
  157.                 }
  158.             }
  159.             if (curr == null)
  160.             {
  161.                 Console.WriteLine("They key is not found in the tree");
  162.                 return root;
  163.             }
  164.             // Първи случай когато е листо
  165.             if (curr.left == null && curr.right == null)
  166.             {
  167.                 if (curr != root) // Задаваме на бащата ляво/дясно да са null
  168.                 {
  169.                     if (parent.left == curr)
  170.                     {
  171.                         parent.left = null;
  172.                     }
  173.                     else
  174.                     {
  175.                         parent.right = null;
  176.                     }
  177.                 }
  178.                 else // Ако е само един го задавеме за null
  179.                 {
  180.                     root = null;
  181.                 }
  182.             }
  183.             // Втори случай -> Ако нодът има само едно дете
  184.             else
  185.             {
  186.                 // Избираме син на нодът
  187.                 Node child = (curr.left != null) ? curr.left : curr.right;
  188.  
  189.                 // Ако нодът, който ще изтрием, не е root нод задаваме бащите като деца
  190.                 if (curr != root)
  191.                 {
  192.                     if (curr == parent.left)
  193.                     {
  194.                         parent.left = child;
  195.                     }
  196.                     else
  197.                     {
  198.                         parent.right = child;
  199.                     }
  200.                 }
  201.                 else
  202.                 {
  203.                     root = child;
  204.                 }
  205.             }
  206.             return root;
  207.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement