Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.55 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.  
  7. namespace BST_1
  8. {
  9.     class Program
  10.     {
  11.         public class BinarySearchTree
  12.         {
  13.             class Węzeł
  14.             {
  15.                 public int wartość;
  16.                 public Węzeł lewy;
  17.                 public Węzeł prawy;
  18.  
  19.                 public Węzeł(int wartość)
  20.                 {
  21.                     this.wartość = wartość;
  22.                     lewy = prawy = null;
  23.                 }
  24.             }
  25.  
  26.             Węzeł korzeń;
  27.  
  28.             public BinarySearchTree()
  29.             {
  30.                 korzeń = null;
  31.             }
  32.  
  33.             //DODAWANIE DO DRZEWA W WERSJI REKURENCYJNEJ
  34.             public void dodaj(int wartość)
  35.             {
  36.                 korzeń = DodajRekurencyjnie(korzeń, wartość);
  37.             }
  38.             Węzeł DodajRekurencyjnie(Węzeł korzeń, int wartość)
  39.             {
  40.  
  41.                 if (korzeń == null)
  42.                 {
  43.                     korzeń = new Węzeł(wartość);
  44.                     return korzeń;
  45.                 }
  46.  
  47.                 if (wartość < korzeń.wartość)
  48.                 {
  49.                     korzeń.lewy = DodajRekurencyjnie(korzeń.lewy, wartość);
  50.  
  51.                 }
  52.                 else if (wartość > korzeń.wartość)
  53.                 {
  54.                     korzeń.prawy = DodajRekurencyjnie(korzeń.prawy, wartość);
  55.                 }
  56.                 return korzeń;
  57.             }
  58.  
  59.  
  60.  
  61.             //DODAWANIE DO DRZEWA W WERSJI ITERACYJNEJ
  62.             public void DodajIteracyjnie(int wartość)
  63.             {
  64.                 if (korzeń == null)
  65.                 {
  66.                     korzeń = new Węzeł(wartość);
  67.                 }
  68.                 else
  69.                 {
  70.                     Węzeł tmp = korzeń;
  71.                     while (true)
  72.                     {
  73.                         if (wartość < tmp.wartość)
  74.                         {
  75.                             if (tmp.lewy == null)
  76.                             {
  77.                                 tmp.lewy = new Węzeł(wartość);
  78.                                 return;
  79.                             }
  80.                             else
  81.                             {
  82.                                 tmp = tmp.lewy;
  83.                             }
  84.                         }
  85.                         else
  86.                         {
  87.                             if (tmp.prawy == null)
  88.                             {
  89.                                 tmp.prawy = new Węzeł(wartość);
  90.                                 return;
  91.                             }
  92.                             else
  93.                             {
  94.                                 tmp = tmp.prawy;
  95.                             }
  96.                         }
  97.                     }
  98.                 }
  99.             }
  100.  
  101.  
  102.             //wypisywanie in-order
  103.             public void InOrder()
  104.             {
  105.                 InOrderRekurencyjnie(korzeń);
  106.             }
  107.             void InOrderRekurencyjnie(Węzeł korzeń)
  108.             {
  109.                 if (korzeń != null)
  110.                 {
  111.                     InOrderRekurencyjnie(korzeń.lewy);
  112.                     Console.Write(korzeń.wartość + " ");
  113.                     InOrderRekurencyjnie(korzeń.prawy);
  114.  
  115.                 }
  116.             }
  117.  
  118.  
  119.             public void PostOrder()
  120.             {
  121.                 PostOrderRekurencyjnie(korzeń);
  122.             }
  123.             void PostOrderRekurencyjnie(Węzeł korzeń)
  124.             {
  125.                 if (korzeń != null)
  126.                 {
  127.                     PostOrderRekurencyjnie(korzeń.lewy);
  128.                     PostOrderRekurencyjnie(korzeń.prawy);
  129.                     Console.WriteLine(korzeń.wartość);
  130.                 }
  131.             }
  132.  
  133.  
  134.  
  135.             public void PreOrder()
  136.             {
  137.                 PreOrderRekurencyjnie(korzeń);
  138.             }
  139.             void PreOrderRekurencyjnie(Węzeł korzeń)
  140.             {
  141.                 if (korzeń != null)
  142.                 {
  143.                     Console.WriteLine(korzeń.wartość);
  144.                     PreOrderRekurencyjnie(korzeń.lewy);
  145.                     PreOrderRekurencyjnie(korzeń.prawy);
  146.                 }
  147.             }
  148.  
  149.             public void Usun(int wartość)
  150.             {
  151.                 korzeń = UsunRekurencyjnie(korzeń, wartość);
  152.             }
  153.             Węzeł UsunRekurencyjnie(Węzeł korzeń, int wartość)
  154.             {
  155.                 //jezeli puste
  156.                 if (korzeń == null) return korzeń;
  157.                 if (wartość < korzeń.wartość)
  158.                 {
  159.                     korzeń.lewy = UsunRekurencyjnie(korzeń.lewy, wartość);
  160.                 }
  161.                 else if (wartość > korzeń.wartość)
  162.                 {
  163.                     korzeń.prawy = UsunRekurencyjnie(korzeń.prawy, wartość);
  164.                 }
  165.                 else
  166.                 {
  167.                     if (korzeń.lewy == null)
  168.                         return korzeń.prawy;
  169.                     if (korzeń.prawy == null)
  170.                         return korzeń.lewy;
  171.                     korzeń.wartość = Najmniejsza_Wartość(korzeń.prawy);
  172.  
  173.                     korzeń.prawy = UsunRekurencyjnie(korzeń.prawy, korzeń.wartość);
  174.  
  175.                 }
  176.                 return korzeń;
  177.             }
  178.  
  179.          
  180.             public void Najmniejsza_Wartość()
  181.             {
  182.                 Console.Write("Najmniejsza wartość " + Najmniejsza_Wartość(korzeń));
  183.             }
  184.             int Najmniejsza_Wartość(Węzeł korzeń)
  185.             {
  186.                 int minimum = korzeń.wartość;
  187.                 while (korzeń.lewy != null)
  188.                 {
  189.                     minimum = korzeń.lewy.wartość;
  190.                     korzeń = korzeń.lewy;
  191.                 }
  192.                 return minimum;
  193.             }
  194.  
  195.  
  196.             public void Największa_Wartość()
  197.             {
  198.                 Console.WriteLine("Największa wartość: " + Największa_Wartość(korzeń));
  199.             }
  200.  
  201.             private int Największa_Wartość(Węzeł węzeł)
  202.             {
  203.                 int maksimum = węzeł.wartość;
  204.                 if(korzeń.prawy != null)
  205.                 {
  206.                     maksimum = węzeł.prawy.wartość;
  207.                     węzeł = węzeł.prawy;
  208.                 }
  209.                 return maksimum;
  210.             }
  211.  
  212.  
  213.            
  214.             //sprawdzenie czy drzewo binarne
  215.             //czy występuje wartość w drzewie
  216.  
  217.             public bool CzyWystępuje(int wartość)
  218.             {
  219.                 return CzyWystepujeRekurencyjnie(korzeń, wartość);
  220.             }
  221.             bool CzyWystepujeRekurencyjnie(Węzeł korzeń, int wartość)
  222.             {
  223.                 if (korzeń == null)
  224.                 {
  225.                     return false;
  226.                 }
  227.                 if (korzeń.wartość == wartość)
  228.                 {
  229.                     return true;
  230.                 }
  231.                 if (wartość < korzeń.wartość)
  232.                 {
  233.                     return CzyWystepujeRekurencyjnie(korzeń.lewy, wartość);
  234.                 }
  235.                 return CzyWystepujeRekurencyjnie(korzeń.prawy, wartość);
  236.             }
  237.    
  238.  
  239.         }
  240.  
  241.         static void Main(string[] args)
  242.         {
  243.             BinarySearchTree drzewo = new BinarySearchTree();
  244.             //drzewo.WstawIter(50);
  245.             //drzewo.WstawIter(30);
  246.             //drzewo.WstawIter(20);
  247.             //drzewo.WstawIter(40);
  248.             drzewo.DodajIteracyjnie(6);
  249.             drzewo.DodajIteracyjnie(3);
  250.             drzewo.DodajIteracyjnie(1);
  251.             drzewo.DodajIteracyjnie(2);
  252.             drzewo.DodajIteracyjnie(4);
  253.             drzewo.DodajIteracyjnie(5);
  254.             drzewo.DodajIteracyjnie(7);
  255.             drzewo.Usun(50);
  256.  
  257.             //drzewo.dodaj(50);
  258.             //drzewo.dodaj(30);
  259.             //drzewo.dodaj(20);
  260.             //drzewo.dodaj(40);
  261.             //drzewo.dodaj(70);
  262.             //drzewo.dodaj(60);
  263.             //drzewo.dodaj(80);
  264.             //Console.WriteLine("Wypisywanie in-order");
  265.             //drzewo.InOrder();
  266.             //Console.WriteLine(" \n Delete 20");
  267.             //drzewo.Usun(20);
  268.             //Console.WriteLine("Wypisywanie in-order");
  269.             drzewo.InOrder();
  270.             //drzewo.Najmniejsza_Wartość();
  271.             //drzewo.Największa_Wartość();
  272.             //Console.WriteLine(" \n Delete 50");
  273.             //drzewo.Usun(50);
  274.             ////drzewo.dodaj(20);
  275.             //drzewo.InOrder();
  276.             //Console.WriteLine("Czy występuje wartość 70: " + drzewo.CzyWystępuje(70));
  277.             //Console.WriteLine("Czy występuje wartość 120: " + drzewo.CzyWystępuje(120));
  278.             //Console.WriteLine("Wypisywanie post-order");
  279.             //drzewo.PostOrder();
  280.             //Console.WriteLine("Wypisywanie pre-order");
  281.             //drzewo.PreOrder();
  282.             Console.ReadKey();
  283.  
  284.         }
  285.     }
  286. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement