Реализация бинарного дерева с использованием указателей - 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);
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д