Advertisement
gride29

zad8

Dec 15th, 2020
702
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.28 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace zad8
  5. {
  6.     class Węzeł
  7.     {
  8.         public int wartość;
  9.         public Węzeł lewy;
  10.         public Węzeł prawy;
  11.     }
  12.  
  13.     class Drzewo
  14.     {
  15.         public Węzeł korzeń;
  16.     }
  17.  
  18.     class Program
  19.     {
  20.         static Węzeł UtwórzWęzeł(int wartość)
  21.         {
  22.             Węzeł węzeł = new Węzeł();
  23.             węzeł.wartość = wartość;
  24.             return węzeł;
  25.         }
  26.  
  27.         static void InicjujWęzeł(Węzeł węzeł, int wartość)
  28.         {
  29.             węzeł.wartość = wartość;
  30.         }
  31.  
  32.         static void Wypisuj(Węzeł węzeł, int poziom)
  33.         {
  34.             string wcięcie = "";
  35.             int p = poziom;
  36.             while (p-- > 0) wcięcie += " ";
  37.             if (węzeł == null) Console.WriteLine(wcięcie + "*");
  38.             else
  39.             {
  40.                 if (węzeł.lewy != null || węzeł.prawy != null)
  41.                     Wypisuj((Węzeł)węzeł.prawy, poziom + 3);
  42.                 Console.WriteLine(wcięcie + węzeł.wartość);
  43.                 if (węzeł.lewy != null || węzeł.prawy != null)
  44.                     Wypisuj((Węzeł)węzeł.lewy, poziom + 3);
  45.             }
  46.         }
  47.  
  48.         static void Wstaw(Drzewo drzewo, Węzeł węzeł)
  49.         {
  50.             if (drzewo.korzeń == null) drzewo.korzeń = węzeł;
  51.             else
  52.             {
  53.                 Węzeł tmp = drzewo.korzeń;
  54.                 while (tmp != null)
  55.                 {
  56.                     if (tmp.wartość > węzeł.wartość)
  57.                     {
  58.                         if (tmp.lewy != null) tmp = tmp.lewy;
  59.                         else
  60.                         {
  61.                             tmp.lewy = węzeł; return;
  62.                         }
  63.                     }
  64.                     else
  65.                     {
  66.                         if (tmp.prawy != null) tmp = tmp.prawy;
  67.                         else
  68.                         {
  69.                             tmp.prawy = węzeł; return;
  70.                         }
  71.                     }
  72.                 }
  73.             }
  74.         }
  75.  
  76.         static void LewaRotacja(Węzeł w)
  77.         {
  78.             if (w.prawy == null)
  79.             {
  80.                 Console.WriteLine("Nie można obrócić!");
  81.                 return;
  82.             }
  83.  
  84.             Drzewo poddrzewo = new Drzewo();
  85.             Węzeł pomocniczy = UtwórzWęzeł(w.wartość);
  86.  
  87.             poddrzewo.korzeń = pomocniczy;
  88.             poddrzewo.korzeń.prawy = w.prawy.lewy;
  89.             poddrzewo.korzeń.lewy = w.lewy;
  90.  
  91.             w.wartość = w.prawy.wartość;
  92.             w.lewy = poddrzewo.korzeń;
  93.             w.prawy = w.prawy.prawy;
  94.         }
  95.  
  96.         static void PrawaRotacja(Węzeł w)
  97.         {
  98.             if (w.lewy == null)
  99.             {
  100.                 Console.WriteLine("Nie można obrócić!");
  101.                 return;
  102.             }
  103.  
  104.             Drzewo poddrzewo = new Drzewo();
  105.             Węzeł pomocniczy = UtwórzWęzeł(w.wartość);
  106.  
  107.             poddrzewo.korzeń = pomocniczy;
  108.             poddrzewo.korzeń.lewy = w.lewy.prawy;
  109.             poddrzewo.korzeń.prawy = w.prawy;
  110.  
  111.             w.wartość = w.lewy.wartość;
  112.             w.prawy = poddrzewo.korzeń;
  113.             w.lewy = w.lewy.lewy;
  114.         }
  115.  
  116.         static int Wysokość(Węzeł węzeł)
  117.         {
  118.             int wysokość = 0;
  119.             if (węzeł == null) return 0;
  120.             if (węzeł.lewy != null)
  121.                 wysokość = Math.Max(wysokość, Wysokość(węzeł.lewy) + 1);
  122.             if (węzeł.prawy != null)
  123.                 wysokość = Math.Max(wysokość, Wysokość(węzeł.prawy) + 1);
  124.             return wysokość;
  125.         }
  126.  
  127.         static void WstawJakoKorzeń(ref Drzewo drzewo, Węzeł węzeł)
  128.         {
  129.             int k = 0;
  130.             int[] tab = new int[Wysokość(drzewo.korzeń) + 1];
  131.            
  132.             if (drzewo.korzeń == null) drzewo.korzeń = węzeł;
  133.             else
  134.             {
  135.                 Węzeł tmp = drzewo.korzeń;
  136.                 while (tmp != null)
  137.                 {
  138.                     if (tmp.wartość > węzeł.wartość)
  139.                     {
  140.                         tab[k] = 0;
  141.                         k++;
  142.                         if (tmp.lewy != null) tmp = tmp.lewy;
  143.                         else
  144.                         {
  145.                             tmp.lewy = węzeł;
  146.                             break;
  147.                         }
  148.                     }
  149.                     else
  150.                     {
  151.                         tab[k] = 1;
  152.                         k++;
  153.                         if (tmp.prawy != null) tmp = tmp.prawy;
  154.                         else
  155.                         {
  156.                             tmp.prawy = węzeł;
  157.                             break;
  158.                         }
  159.                     }
  160.                 }
  161.             }
  162.             for (int i = tab.Length - 1; i >= 0; --i)
  163.             {
  164.                 Węzeł rodzic = drzewo.korzeń;
  165.  
  166.                 for (int j = 0; j < i; ++j)
  167.                 {
  168.                     if (tab[j] == 1)
  169.                     {
  170.                         rodzic = rodzic.prawy;
  171.                     }
  172.                     else
  173.                     {
  174.                         rodzic = rodzic.lewy;
  175.                     }
  176.                 }
  177.                 if (tab[i] == 0)
  178.                 {
  179.                     PrawaRotacja(rodzic);
  180.                 }
  181.                 else
  182.                 {
  183.                     LewaRotacja(rodzic);
  184.                 }
  185.             }
  186.         }
  187.  
  188.         static void Main(string[] args)
  189.         {
  190.             int[] tab = { 10, 16, 12, 7, 9, 2, 21, 6, 17, 1, 15 };
  191.  
  192.             Drzewo drzewoA = new Drzewo();
  193.  
  194.             for (int i = 0; i < tab.Length; i++)
  195.             {
  196.                 Węzeł w = new Węzeł();
  197.                 InicjujWęzeł(w, tab[i]);
  198.                 Wstaw(drzewoA, w);
  199.             }
  200.  
  201.             Console.WriteLine("====PRZED WSTAWIENIEM====");
  202.             Wypisuj(drzewoA.korzeń, 0);
  203.             Węzeł nowy = UtwórzWęzeł(14);
  204.             WstawJakoKorzeń(ref drzewoA, nowy);
  205.             Console.WriteLine("====PO WSTAWIENIU====");
  206.             Wypisuj(drzewoA.korzeń, 0);
  207.             Console.ReadKey();
  208.         }
  209.     }
  210. }
  211.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement