Advertisement
mikymaione

Algo_20170718_2

Oct 13th, 2017
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.29 KB | None | 0 0
  1. public static int Algo_20170718_2(BST T, int h)
  2. {            
  3.     if (T == null)
  4.     {
  5.         return -1;
  6.     }
  7.     else
  8.     {  
  9.         // valori costanti di s & d ad ogni inizio di ricorsione
  10.         var s = 5;
  11.         var d = 3;
  12.         Console.WriteLine("Ispezionando {0}: h:{1} s:{2} d:{3}", T.key, h, s, d);
  13.  
  14.         if (T.sx != null)
  15.             s = Algo_20170718_2(T.sx, h + 11);
  16.        
  17.         if (T.dx != null)
  18.             d = Algo_20170718_2(T.dx, h + 7);
  19.  
  20.         var ret =
  21.             (s == 5 && d == 3) ?
  22.             h :
  23.             s + d;
  24.  
  25.         Console.WriteLine("Ispezionando {0}: h:{1} s:{2} d:{3} ret:{4}", T.key, h, s, d, ret);
  26.  
  27.         return ret;
  28.     }              
  29. }
  30.  
  31. public static int Algo_20170718_2_Miky(BST T, int h)
  32. {
  33.     BST last = null;
  34.     BST next = null;
  35.     BST curr = T;
  36.     var S = new Stack<BST>();
  37.            
  38.     var RET = -1;
  39.  
  40.     var S_s = new Stack<int>();
  41.     var S_d = new Stack<int>();
  42.     var S_h = new Stack<int>();          
  43.  
  44.     S_h.Push(h);
  45.  
  46.     while (S.Count > 0 || curr != null)
  47.     {
  48.         if (curr != null)
  49.         {
  50.             S.Push(curr);
  51.             next = curr.Sx;
  52.  
  53.             // valori costanti di s & d ad ogni inizio di ricorsione
  54.             var temp_s = 5;
  55.             var temp_d = 3;
  56.             S_s.Push(temp_s);
  57.             S_d.Push(temp_d);
  58.  
  59.             var temp_h_sx = S_h.Peek();
  60.             if (next != null)
  61.                 S_h.Push(temp_h_sx += 11);                                                              
  62.  
  63.             Console.WriteLine("Ispezionando {0}: h:{1} s:{2} d:{3}", curr.key, temp_h_sx, temp_s, temp_d);
  64.         }
  65.         else
  66.         {
  67.             curr = S.Peek();
  68.  
  69.             if (curr.Dx != null && curr.Dx != last)
  70.             {
  71.                 next = curr.Dx;
  72.  
  73.                 var temp_h_dx = S_h.Peek();                        
  74.                 if (next != null)
  75.                     S_h.Push(temp_h_dx += 7);                        
  76.             }
  77.             else
  78.             {
  79.                 next = null;
  80.                 S.Pop();
  81.  
  82.                 var temp_h = S_h.Pop();
  83.                 var temp_s = S_s.Pop();
  84.                 var temp_d = S_d.Pop();
  85.  
  86.                 var temp_ret =
  87.                     (temp_s == 5 && temp_d == 3) ?
  88.                     temp_h :
  89.                     temp_s + temp_d;
  90.  
  91.                 if (S.Count > 0)
  92.                 {
  93.                     if (curr == S.Peek().sx) // sono un sinitro
  94.                     {
  95.                         S_s.Pop();
  96.                         S_s.Push(temp_ret);
  97.                     }
  98.                     else if (curr == S.Peek().dx) // sono un destro
  99.                     {
  100.                         S_d.Pop();
  101.                         S_d.Push(temp_ret);
  102.                     }
  103.                 }
  104.  
  105.                 Console.WriteLine("Ispezionando {0}: h:{1} s:{2} d:{3} ret:{4}", curr.key, temp_h, temp_s, temp_d, temp_ret);
  106.                 RET = temp_ret;
  107.             }
  108.         }
  109.  
  110.         last = curr;
  111.         curr = next;
  112.     }
  113.  
  114.     return RET;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement