Вставка нового узла в бинарное дерево - C#

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

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

Подскажите можно ли как-то реализовать, чтобы в консоле можно было вставлять новый узел, нахождение отца и правого, левого сыновей произвольной?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ConsoleApplication36;
 
namespace ConsoleApplication36

{
    //класс элемента связного списка
    public sealed class ListElement<T1>
    {
        //суть - узел 
        private ListElement<T1> PrevElement;
        private ListElement<T1> NextElement;
        private T1 DateElement;
 
        //новый элемент
        public ListElement(ListElement<T1> PrevElement, ListElement<T1> NextElement, T1 DateElement)
        {
            this.PrevElement = PrevElement;
            this.NextElement = NextElement;
            this.DateElement = DateElement;
        }
 
        //замена частей узла
        public ListElement<T1> GetSetNextElement
        {
            get { return this.NextElement; }
            set { this.NextElement = value; }
        }
 
        public ListElement<T1> GetSetPrevElement
        {
            get { return this.PrevElement; }
            set { this.PrevElement = value; }
        }
 
        public T1 GetSetDateElement
        {
            get { return this.DateElement; }
            set { this.DateElement = value; }
        }
    }
 
    class MyLinkedList<T1>
    {
        private ListElement<T1> LastElement;
        private ListElement<T1> FirstElement;
 
        private int count = 0;
 
        //число элементов списка
        public int NumberOfElements()
        {
            return count;
        }
 
        //добавить элемент в список
        public void AddElement(T1 elem)
        {
            if (FirstElement == null)
            {
                ListElement<T1> NewElement = new ListElement<T1>(null, null, elem);
                FirstElement = NewElement;
                LastElement = NewElement;
            }
            else
            {
                ListElement<T1> NewElement = new ListElement<T1>(LastElement, null, elem);
                LastElement.GetSetNextElement = NewElement;
                LastElement = NewElement;
            }
            count++;
        }
 
        //Добавить элемент по индексу
        public T1 AddToPosition(T1 elem, int index)
        {
            ListElement<T1> Last = LastElement;
            ListElement<T1> Next = SearchElement(index);
 
            if (index == 0)
            {
                FirstElement = new ListElement<T1>(null, null, elem);
                FirstElement.GetSetNextElement = Next;
                Next.GetSetPrevElement = FirstElement;
                return default(T1);
            }
 
            ListElement<T1> Prev = SearchElement(index - 1);
            ListElement<T1> NewElement = new ListElement<T1>(null, null, elem);

            Prev.GetSetNextElement = NewElement;
            NewElement.GetSetPrevElement = Prev;
            Next.GetSetPrevElement = NewElement;
            NewElement.GetSetNextElement = Next;
 
            count++;
 
            LastElement = Last;
 
            return default(T1);
        }
 
        //удалить элемент по индексу
        public T1 DeleteElement(int index)
        {
            ListElement<T1> Prev;
            ListElement<T1> Next;
 
            if (index == 0)
            {
                FirstElement = SearchElement(index + 1);
                return default(T1);
            }
 
            Prev = SearchElement(index - 1);
            Next = SearchElement(index + 1);
 
            Prev.GetSetNextElement = Next;
            Next.GetSetPrevElement = Prev;
 
            count--;
 
            return default(T1);
 
        }
 
        //прочитать элемент по индексу
        public T1 ReadElement(int index)
        {
            ListElement<T1> Element = SearchElement(index);
            return Element.GetSetDateElement;
        }
 
        //записать элемент по индексу
        public T1 WriteElement(T1 elem, int index)
        {
            ListElement<T1> Element = SearchElement(index);
            return Element.GetSetDateElement = elem;
        }
 
        //выбор направления поиска и поиск элемента
        public ListElement<T1> SearchElement(int index)
        {
            //присваиваю первый или последний член списка
            ListElement<T1> Prev = LastElement;
            ListElement<T1> Next = FirstElement;
 
            //Проверка на недопустимый индекс / проход с начала / конца списка.
            if (index > count || index < 0)
            {
                throw new IndexOutOfRangeException();
            }
            else if (index < ((count + 1) / 2))
            {
                if (index == 0)
                {
                    return FirstElement;
                }
 
                for (; index != 0; index--)
                {
                    Next = Next.GetSetNextElement;
                }
 
                return Next;
            }
            else
            {
                for (; index < count; index++)
                {
                    Prev = Prev.GetSetPrevElement;
                }
 
                return Prev;
            }
        }
 
        //очистить список
        public void DeleteAllElements()
        {
            FirstElement = null;
            count = 0;
        }
    }
}
 
class Program
{
    static void Main(string[] args)
    {
        List<int> list = new List<int>();
        Random random = new Random();
        for (int i = 0; i < 10; i++)
        {
            int v = random.Next() % 100;
            Console.Write(v + " ");
            list.PushBack(v);
        }
        Console.WriteLine();
        list.PushFront(1);
        list.PushFront(2);
        for (int i = 0; i < list.Count; i++)
            Console.Write(list[i] + " ");
        Console.WriteLine();
        list.Erase(3);
        for (int i = 0; i < list.Count; i++)
            Console.Write(list[i] + " ");
        Console.WriteLine();
        list.Sort();
        for (int i = 0; i < list.Count; i++)
            Console.Write(list[i] + " ");
        Console.WriteLine();
        while (!list.IsEmpty)
        {
            int v = list.PopBack();
            Console.Write(v + " ");
        }
        Console.ReadKey(true);
    }
}
пробовал таким способом, но выдает кучу ошибок.
public static void Main()
    {
        const int n = 20;
        MyCollections.LinkedList<int> list = new MyCollections.LinkedList<int>();
        int val = 0;
        int pos = 0;
        string yn = "y";
       
            Console.WriteLine("Ввод чисел:");
 
            for (int i = 1; i <= n; ++i)
 
                list.AddBack(int.Parse(Console.ReadLine()));
 
            /*Console.Write("Число для вставки в список: ");
            val = int.Parse(Console.ReadLine());
 
            Console.Write("Позиция для вставки: ");
            pos = int.Parse(Console.ReadLine()) - 1;*/
           // yn = "y";
            while(yn == "y")
            {

            Console.Write("Число для вставки в список: ");
            val = int.Parse(Console.ReadLine());
            Console.Write("Позиция для вставки: ");
            pos = int.Parse(Console.ReadLine()) - 1;
            list.Insert(pos, val);
 
            foreach (int item in list)
                Console.Write("{0} ", item);
            Console.ReadLine();
            Console.Write("Продолжить? y/n ");
            yn = Console.ReadLine();

Решение задачи: «Вставка нового узла в бинарное дерево»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
 
namespace ConsoleApplication188
{
    class Program
    {
        static void Main(string[] args)
        {
            Node<int> root = new Node<int>{Data = 1};
 
            while(true)
            {
                Console.Clear();
                Console.WriteLine("Tree:");
                Console.BackgroundColor = ConsoleColor.DarkGray;
                Console.WriteLine(root.ToStringTree() + "\r\n");
                Console.BackgroundColor = ConsoleColor.Black;
                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.WriteLine("1 Add Left");
                Console.WriteLine("2 Add Right");
                Console.WriteLine("3 Remove");
                Console.WriteLine("4 Get parent");
                Console.WriteLine("5 Get Left");
                Console.WriteLine("6 Get Right");
                Console.WriteLine("9 Exit");
 
                Console.ForegroundColor = ConsoleColor.Gray;
                var command = ReadInt();
 
                if (command == 9) break;
 
                int data = ReadInt("Enter data of node: ");
 
                var node = root.GetThisAndAllChilds(d => d == data).FirstOrDefault();
                if (node == null)
                    WriteAndWait("Node is not found");
                else
                switch(command)
                {
                    case 1: node.InsertLeft(new Node<int> { Data = ReadInt("Enter data of new child node: ") }); break;
                    case 2: node.InsertRight(new Node<int> { Data = ReadInt("Enter data of new child node: ") }); break;
                    case 3: if(node.Parent != null) node.Parent.DeleteChild(node); break;
                    case 4: if (node.Parent != null) WriteAndWait("Parent: " + node.Parent); break;
                    case 5: if (node.Left != null) WriteAndWait("Left: " + node.Left); break;
                    case 6: if (node.Right != null) WriteAndWait("Right: " + node.Right); break;
                }
            }
        }
 
        private static void WriteAndWait(string str)
        {
            Console.WriteLine(str);
            Console.Write("(press any key to continue...)");
            Console.ReadKey();
        }
 
        static int ReadInt(string title = "")
        {
            if(title != null)
                Console.Write(title);
 
            int res = 0;
 
            while(true)
            if (int.TryParse(Console.ReadLine(), out res))
                return res;
        }
    }
 
    class Node<T>
    {
        public Node<T> Parent { get; private set; }
        public Node<T> Left { get; private set; }
        public Node<T> Right { get; private set; }
        public T Data { get; set; }
 
        public void InsertRight(Node<T> node)
        {
            node.Right = Right;
            Right = node;
            node.Parent = this;
        }
 
        public void InsertLeft(Node<T> node)
        {
            node.Left = Left;
            Left = node;
            node.Parent = this;
        }
 
        public void DeleteChild(Node<T> node)
        {
            if (Right == node) Right = null;
            if (Left == node) Left = null;
            node.Parent = null;
        }
 
        public IEnumerable<Node<T>> GetThisAndAllChilds(Predicate<T> condition = null)
        {
            if(condition == null || condition(Data))
                yield return this;
 
            if (Right != null)
                foreach (var n in Right.GetThisAndAllChilds(condition))
                    yield return n;
 
            if (Left != null)
                foreach (var n in Left.GetThisAndAllChilds(condition))
                    yield return n;
        }
 
        public override string ToString()
        {
            return Data.ToString();
        }
 
        public string ToStringTree(int indent = 0)
        {
            var sb = new StringBuilder();
            sb.AppendLine(new String(' ', indent) + ToString());
            if (Right != null)
                sb.Append(Right.ToStringTree(indent + 1));
            if (Left != null)
                sb.Append(Left.ToStringTree(indent + 1));
 
            return sb.ToString();
        }
    }
}

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


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

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

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