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

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

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

Ребят здравствуйте . Хочу реализовать бинарное дерево на С#. Проблема у меня в следующем : при передаче указателя как параметра методу Insert не инициализируется значение valueFild. Собственно сам код:
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);

        }
    }
}
По идеи в get.valueFild должно быть значение 10 а там 0. Обясните почему так получилось. Заранее спасибо.

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

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);
               
 
            }
 
            
        }

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


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

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

14   голосов , оценка 4.357 из 5
Похожие ответы