Реализация бинарного дерева с использованием указателей - 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);
}
}