Реализация бинарного дерева с использованием указателей - C#

Узнай цену своей работы

Формулировка задачи:

Ребят здравствуйте . Хочу реализовать бинарное дерево на С#. Проблема у меня в следующем : при передаче указателя как параметра методу Insert не инициализируется значение valueFild. Собственно сам код:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace TreeCSharp
  7. {
  8. struct item
  9. {
  10. public byte valueFild;
  11. public unsafe item* parent;
  12. public unsafe item* leftChild;
  13. public unsafe item* rightChild;
  14. }
  15. class Tree
  16. {
  17. unsafe item* root;
  18. public unsafe Tree()
  19. {
  20. root = null;
  21. }
  22. public unsafe void ShowTree(item* value)
  23. {
  24. if (value != null)
  25. {
  26. ShowTree(value->leftChild);
  27. Console.WriteLine(value->valueFild);
  28. ShowTree(value->rightChild);
  29.  
  30. }
  31. }
  32. public unsafe void Insert(byte val, item* element)
  33. {
  34. //if (null == element)
  35. //{
  36. // item temp = new item();
  37. // element = &temp;
  38. // element->valueFild = val;
  39. // element->leftChild = element->rightChild = null;
  40. //}
  41. //else
  42. //{
  43. item temp = new item();
  44. element = &temp;
  45. element->valueFild = val;
  46. element->leftChild = element->rightChild = null;
  47.  
  48. //}
  49. }
  50.  
  51. }
  52. class Program
  53. {
  54. static unsafe void Main(string[] args)
  55. {
  56. item get = new item();
  57. item * pointer = &get;
  58. Tree ret = new Tree();
  59. ret.Insert((byte)10,pointer);
  60. ret.ShowTree(pointer);
  61.  
  62. }
  63. }
  64. }
По идеи в get.valueFild должно быть значение 10 а там 0. Обясните почему так получилось. Заранее спасибо.

Решение задачи: «Реализация бинарного дерева с использованием указателей»

textual
Листинг программы
  1.         public unsafe void ShowTree(itemTree* item)// Рекурсивный обход дерева начиная с указаного елемента и вывода эго на экран
  2.         {
  3.             if (item != null)
  4.             {
  5.  
  6.                 if (item->leftChild != null & item->centrCgild != null & item->rightChild != null)
  7.                 {
  8.                     Console.WriteLine(item->valueFild = 4);
  9.                 }
  10.                 else if (
  11.                     (item->leftChild == null & item->centrCgild != null & item->rightChild != null) ||
  12.                     (item->leftChild != null & item->centrCgild == null & item->rightChild != null) ||
  13.                     (item->leftChild != null & item->centrCgild != null & item->rightChild == null)
  14.                         )
  15.                 {
  16.                     Console.WriteLine(item->valueFild = 3);
  17.                 }
  18.                 else if
  19.                     (
  20.                      (item->leftChild == null & item->centrCgild == null & item->rightChild != null) ||
  21.                      (item->leftChild != null & item->centrCgild == null & item->rightChild == null) ||
  22.                      (item->leftChild == null & item->centrCgild != null & item->rightChild == null)
  23.  
  24.                     )
  25.                 {
  26.                     Console.WriteLine(item->valueFild = 2);
  27.                 }
  28.                 else
  29.                 {
  30.                     Console.WriteLine(item->valueFild=1);
  31.                 }
  32.  
  33.                 ShowTree(item->leftChild);
  34.                 ShowTree(item->centrCgild);
  35.                 ShowTree(item->rightChild);
  36.  
  37.  
  38.  
  39.             }
  40.         }
  41.  
  42.         public unsafe void InsertItem(itemTree* element, itemTree* parent = null, SideChild sideAdd = SideChild.Left) //Метод вставки потомка или предка в общюю структуру древа
  43.         {
  44.  
  45.             if (parent == null)
  46.             {
  47.                 root = element;
  48.             }
  49.  
  50.             else
  51.             {
  52.                 if (sideAdd == SideChild.Left & parent->leftChild == null)
  53.                 {
  54.                     parent->leftChild = element;
  55.                 }
  56.                 else if (sideAdd == SideChild.Centr)
  57.                 {
  58.                     parent->centrCgild = element;
  59.                 }
  60.                 else if (sideAdd == SideChild.Right & parent->rightChild == null)
  61.                 {
  62.                     parent->rightChild = element;
  63.                 }
  64.                 else
  65.                 {
  66.                     Console.WriteLine("Данная ветвь уже занята!");
  67.                 }
  68.  
  69.             }
  70.  
  71.         }
  72.  
  73.  
  74.         public unsafe void CorrectSideItemTree(itemTree* element, itemTree* parent, SideChild side) // Метод изменение положения листа в общей структуре древа
  75.         {
  76.             if (parent != null)
  77.             {
  78.                 if (side == SideChild.Left)
  79.                 {
  80.                     parent->leftChild = element;
  81.                 }
  82.                 else if (side == SideChild.Centr)
  83.                 {
  84.                     parent->centrCgild = element;
  85.                 }
  86.                 else if (side == SideChild.Right)
  87.                 {
  88.                     parent->rightChild = element;
  89.                 }
  90.                 else
  91.                 {
  92.                     Console.WriteLine("Неправильно указанна ветвь");
  93.                 }
  94.             }
  95.             else
  96.             {
  97.                 Console.WriteLine("Не указан предок елемента!");
  98.             }
  99.         }
  100.  
  101.         private unsafe itemTree* FreeBranch()
  102.         {
  103.  
  104.            return FreeBranch(root);
  105.  
  106.  
  107.         }
  108.  
  109.         private unsafe itemTree* FreeBranch(itemTree* temp)
  110.         {
  111.  
  112.             if (temp != null)
  113.             {
  114.                 FreeBranch(temp->leftChild);
  115.                 FreeBranch(temp->centrCgild);
  116.                 FreeBranch(temp->rightChild);
  117.                 return null;
  118.             }
  119.             else
  120.             {
  121.                 return temp;
  122.             }
  123.  
  124.  
  125.         }
  126.  
  127.         public unsafe void DeleteItem( ref itemTree* item, itemTree* pRoot) // Удаление елемента с древа
  128.         {
  129.  
  130.             if (item != null)
  131.             {
  132.                 if (pRoot != null)
  133.                 {
  134.  
  135.                     if (item == pRoot->leftChild)
  136.                     {
  137.                         pRoot->leftChild = null;
  138.                         return;
  139.                     }
  140.                     if (item == pRoot->centrCgild)
  141.                     {
  142.                         pRoot->centrCgild = null;
  143.                         return;
  144.                     }
  145.                     if (item == pRoot->rightChild)
  146.                     {
  147.                         pRoot->rightChild = null;
  148.                         return;
  149.                     }
  150.  
  151.                  
  152.                 }
  153.                      DeleteItem(ref item, pRoot->leftChild);
  154.  
  155.                      DeleteItem(ref item, pRoot->centrCgild);
  156.  
  157.                      DeleteItem(ref item, pRoot->rightChild);
  158.                
  159.  
  160.             }
  161.  
  162.            
  163.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.357 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы