Реализация бинарного дерева с использованием указателей - C#
Формулировка задачи:
Ребят здравствуйте . Хочу реализовать бинарное дерево на С#.
Проблема у меня в следующем : при передаче указателя как параметра методу Insert не инициализируется значение valueFild.
Собственно сам код:
По идеи в get.valueFild должно быть значение 10 а там 0. Обясните почему так получилось. Заранее спасибо.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TreeCSharp { struct item { public byte valueFild; public unsafe item* parent; public unsafe item* leftChild; public unsafe item* rightChild; } class Tree { unsafe item* root; public unsafe Tree() { root = null; } public unsafe void ShowTree(item* value) { if (value != null) { ShowTree(value->leftChild); Console.WriteLine(value->valueFild); ShowTree(value->rightChild); } } public unsafe void Insert(byte val, item* element) { //if (null == element) //{ // item temp = new item(); // element = &temp; // element->valueFild = val; // element->leftChild = element->rightChild = null; //} //else //{ item temp = new item(); element = &temp; element->valueFild = val; element->leftChild = element->rightChild = null; //} } } class Program { static unsafe void Main(string[] args) { item get = new item(); item * pointer = &get; Tree ret = new Tree(); ret.Insert((byte)10,pointer); ret.ShowTree(pointer); } } }
Решение задачи: «Реализация бинарного дерева с использованием указателей»
textual
Листинг программы
public unsafe void ShowTree(itemTree* item)// Рекурсивный обход дерева начиная с указаного елемента и вывода эго на экран { if (item != null) { if (item->leftChild != null & item->centrCgild != null & item->rightChild != null) { Console.WriteLine(item->valueFild = 4); } else if ( (item->leftChild == null & item->centrCgild != null & item->rightChild != null) || (item->leftChild != null & item->centrCgild == null & item->rightChild != null) || (item->leftChild != null & item->centrCgild != null & item->rightChild == null) ) { Console.WriteLine(item->valueFild = 3); } else if ( (item->leftChild == null & item->centrCgild == null & item->rightChild != null) || (item->leftChild != null & item->centrCgild == null & item->rightChild == null) || (item->leftChild == null & item->centrCgild != null & item->rightChild == null) ) { Console.WriteLine(item->valueFild = 2); } else { Console.WriteLine(item->valueFild=1); } ShowTree(item->leftChild); ShowTree(item->centrCgild); ShowTree(item->rightChild); } } public unsafe void InsertItem(itemTree* element, itemTree* parent = null, SideChild sideAdd = SideChild.Left) //Метод вставки потомка или предка в общюю структуру древа { if (parent == null) { root = element; } else { if (sideAdd == SideChild.Left & parent->leftChild == null) { parent->leftChild = element; } else if (sideAdd == SideChild.Centr) { parent->centrCgild = element; } else if (sideAdd == SideChild.Right & parent->rightChild == null) { parent->rightChild = element; } else { Console.WriteLine("Данная ветвь уже занята!"); } } } public unsafe void CorrectSideItemTree(itemTree* element, itemTree* parent, SideChild side) // Метод изменение положения листа в общей структуре древа { if (parent != null) { if (side == SideChild.Left) { parent->leftChild = element; } else if (side == SideChild.Centr) { parent->centrCgild = element; } else if (side == SideChild.Right) { parent->rightChild = element; } else { Console.WriteLine("Неправильно указанна ветвь"); } } else { Console.WriteLine("Не указан предок елемента!"); } } private unsafe itemTree* FreeBranch() { return FreeBranch(root); } private unsafe itemTree* FreeBranch(itemTree* temp) { if (temp != null) { FreeBranch(temp->leftChild); FreeBranch(temp->centrCgild); FreeBranch(temp->rightChild); return null; } else { return temp; } } public unsafe void DeleteItem( ref itemTree* item, itemTree* pRoot) // Удаление елемента с древа { if (item != null) { if (pRoot != null) { if (item == pRoot->leftChild) { pRoot->leftChild = null; return; } if (item == pRoot->centrCgild) { pRoot->centrCgild = null; return; } if (item == pRoot->rightChild) { pRoot->rightChild = null; return; } } DeleteItem(ref item, pRoot->leftChild); DeleteItem(ref item, pRoot->centrCgild); DeleteItem(ref item, pRoot->rightChild); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д