Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бинарное дерево на C#, Вставка элемента, удаление, вывод 
:(
    Опции темы
gypehot19
Дата 16.11.2016, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.6.2016

Репутация: нет
Всего: нет



Прошу помощи. Необходимо реализовать на C# бинарное дерево поиска, вставку элементов поочередно из исходного массива (меньшее - в левую ветку, большее - в правую ветку), реализовать возможность удаления элемента и в конечный массив забить поочередно элементы из заполненного дерево, предварительно отсортировав по возрастанию.
Застопорилась сразу после вставки элемента, никакие идеи в голову не приходят.
И да, если одинаковые элементы добавляются несколько раз, то увеличивать их счетчик в узле на 1. Тоже не знаю как сделать.
Вот что есть:
Код

class Program
    {
        static void Main(string[] args)
        {
            int[] mas_begin = new int[21] { 9, 8, 7, 3, 2, 1, 11, 13, 14, 15, 19, 20, 21, 5, 6, 4, 10, 12, 17, 16, 18 };
            int[] mas_end = new int[21];

            BinaryTree<int> tree = new BinaryTree<int>();
            Console.WriteLine("Поочередно введены числа:");            
            foreach (int d in mas_begin)
            {
                tree.Add(d);
                Console.Write(d + " ");
            }

            Console.ReadLine();
        }
    }

    /// <summary>
    /// класс для одной любой вершины дерева
    /// </summary>
    class Node<T> where T : IComparable
    {
        public Node<T> Left { get; set; }
        public Node<T> Right { get; set; }
        public T value { get; set; }

        public Node(T value)
        {
            this.value = value;
        }
    }

    /// <summary>
    /// общий класс для дерева из всех элементов
    /// </summary>
    class BinaryTree<T> where T: IComparable
    {
        public Node<T> root;

        /// <summary>
        /// добавление элемента
        /// </summary>
        public void Add(T new_value)
        {
            if (root == null) //инициализация корня, если его еще нет
            {
                root = new Node<T>(new_value);
                return;
            }
            AddNew(root, new_value); //выборка куда добавлять следующий элемент, если корень уже есть
        }

        /// <summary>
        /// выборка куда добавлять новый элемент
        /// </summary>
        private static void AddNew(Node<T> this_node, T new_value)
        {
            if (this_node.value.CompareTo(new_value) < 0) //если новое значение меньше текущего, идем по левой ветке
            {
                if (this_node.Left == null) //если левой ветки не было, то создаем ее и оставляем новый элемент здесь
                    this_node.Left = new Node<T>(new_value);
                else //если левая ветка уже есть, то входим в нее и продолжаем дальше искать пустую ветку
                    AddNew(this_node.Left, new_value);
            }
            else //если новое значение больше текущего, идем по правой ветке
            {
                if (this_node.Right == null) //если правой ветки не было, то создаем ее и оставляем новый элемент здесь
                    this_node.Right = new Node<T>(new_value);
                else //если правая ветка уже есть, то входим в нее и продолжаем дальше искать пустую ветку
                    AddNew(this_node.Right, new_value);
            }
        }
    }

PM MAIL   Вверх
chupachups
Дата 17.11.2016, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 15.10.2008

Репутация: нет
Всего: 1



класс ветки неполный, надо дополнить методом добавления и свойством счетчика:
Код

/// <summary>
/// класс для одной любой вершины дерева
/// </summary>
class Node<T> where T : IComparable
{
    public Node<T> Left { get; private set; }
    public Node<T> Right { get; private set; }
    public int Count { get; private set; }
    public T Value { get; private set; }

    public Node(T value)
    {
        this.Value = value;
    }

    /// <summary>
    /// добавление элемента
    /// </summary>
    public void Add(T value)
    {
        if (this.Value.CompareTo(value) == 1)
        {
            // увеличить счетчик
            this.Count++;
        }
        if (this.Value.CompareTo(value) < 0) //если новое значение меньше текущего, идем по левой ветке
        {
            if (this.Left == null) //если левой ветки не было, то создаем ее и оставляем новый элемент здесь
                this.Left = new Node<T>(value);
            else //если левая ветка уже есть, то входим в нее и продолжаем дальше искать пустую ветку
                this.Left.Add(value);
        }
        else //если новое значение больше текущего, идем по правой ветке
        {
            if (this.Right == null) //если правой ветки не было, то создаем ее и оставляем новый элемент здесь
                this.Right = new Node<T>(value);
           else //если правая ветка уже есть, то входим в нее и продолжаем дальше искать пустую ветку
                this.Right.Add(value);
        }
    }
}


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
chupachups
Дата 17.11.2016, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 15.10.2008

Репутация: нет
Всего: 1



класс ветки неполный, надо дополнить методом добавления и свойством счетчика:
Код

/// <summary>
/// класс для одной любой вершины дерева
/// </summary>
class Node<T> where T : IComparable
{
    public Node<T> Left { get; private set; }
    public Node<T> Right { get; private set; }
    public int Count { get; private set; }
    public T Value { get; private set; }

    public Node(T value)
    {
        this.Value = value;
    }

    /// <summary>
    /// добавление элемента
    /// </summary>
    public void Add(T value)
    {
        int res = this.Value.CompareTo(value);
        if (res == 1)
        {
            // увеличить счетчик
            this.Count++;
        }
        if (res < 0) //если новое значение меньше текущего, идем по левой ветке
        {
            if (this.Left == null) //если левой ветки не было, то создаем ее и оставляем новый элемент здесь
                this.Left = new Node<T>(value);
            else //если левая ветка уже есть, то входим в нее и продолжаем дальше искать пустую ветку
                this.Left.Add(value);
        }
        else //если новое значение больше текущего, идем по правой ветке
        {
            if (this.Right == null) //если правой ветки не было, то создаем ее и оставляем новый элемент здесь
                this.Right = new Node<T>(value);
           else //если правая ветка уже есть, то входим в нее и продолжаем дальше искать пустую ветку
                this.Right.Add(value);
        }
    }
}


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
chupachups
Дата 17.11.2016, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 15.10.2008

Репутация: нет
Всего: 1



класс ветки неполный, надо дополнить методом добавления и свойством счетчика:
Код

/// <summary>
/// класс для одной любой вершины дерева
/// </summary>
class Node<T> where T : IComparable
{
    public Node<T> Left { get; private set; }
    public Node<T> Right { get; private set; }
    public int Count { get; private set; }
    public T Value { get; private set; }

    public Node(T value)
    {
        this.Value = value;
    }

    /// <summary>
    /// добавление элемента
    /// </summary>
    public void Add(T value)
    {
        int res = this.Value.CompareTo(value);
        if (res == 1)
        {
            // увеличить счетчик
            this.Count++;
        }
        if (res < 0) //если новое значение меньше текущего, идем по левой ветке
        {
            if (this.Left == null) //если левой ветки не было, то создаем ее и оставляем новый элемент здесь
                this.Left = new Node<T>(value);
            else //если левая ветка уже есть, то входим в нее и продолжаем дальше искать пустую ветку
                this.Left.Add(value);
        }
        else //если новое значение больше текущего, идем по правой ветке
        {
            if (this.Right == null) //если правой ветки не было, то создаем ее и оставляем новый элемент здесь
                this.Right = new Node<T>(value);
           else //если правая ветка уже есть, то входим в нее и продолжаем дальше искать пустую ветку
                this.Right.Add(value);
        }
    }
}



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
chupachups
Дата 17.11.2016, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 15.10.2008

Репутация: нет
Всего: 1



класс ветки неполный, надо дополнить методом добавления и свойством счетчика:
Код

/// <summary>
/// класс для одной любой вершины дерева
/// </summary>
class Node<T> where T : IComparable
{
    public Node<T> Left { get; private set; }
    public Node<T> Right { get; private set; }
    public int Count { get; private set; }
    public T Value { get; private set; }

    public Node(T value)
    {
        this.Value = value;
    }

    /// <summary>
    /// добавление элемента
    /// </summary>
    public void Add(T value)
    {
        int res = this.Value.CompareTo(value);
        if (res == 1)
        {
            // увеличить счетчик
            this.Count++;
        }
        if (res < 0) //если новое значение меньше текущего, идем по левой ветке
        {
            if (this.Left == null) //если левой ветки не было, то создаем ее и оставляем новый элемент здесь
                this.Left = new Node<T>(value);
            else //если левая ветка уже есть, то входим в нее и продолжаем дальше искать пустую ветку
                this.Left.Add(value);
        }
        else //если новое значение больше текущего, идем по правой ветке
        {
            if (this.Right == null) //если правой ветки не было, то создаем ее и оставляем новый элемент здесь
                this.Right = new Node<T>(value);
           else //если правая ветка уже есть, то входим в нее и продолжаем дальше искать пустую ветку
                this.Right.Add(value);
        }
    }
}



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
chupachups
Дата 17.11.2016, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 15.10.2008

Репутация: нет
Всего: 1



класс ветки неполный, надо дополнить методом добавления и свойством счетчика:
Код

/// <summary>
/// класс для одной любой вершины дерева
/// </summary>
class Node<T> where T : IComparable
{
    public Node<T> Left { get; private set; }
    public Node<T> Right { get; private set; }
    public int Count { get; private set; }
    public T Value { get; private set; }

    public Node(T value)
    {
        this.Value = value;
    }

    /// <summary>
    /// добавление элемента
    /// </summary>
    public void Add(T value)
    {
        int res = this.Value.CompareTo(value);
        if (res == 1)
        {
            // увеличить счетчик
            this.Count++;
        }
        if (res < 0) //если новое значение меньше текущего, идем по левой ветке
        {
            if (this.Left == null) //если левой ветки не было, то создаем ее и оставляем новый элемент здесь
                this.Left = new Node<T>(value);
            else //если левая ветка уже есть, то входим в нее и продолжаем дальше искать пустую ветку
                this.Left.Add(value);
        }
        else //если новое значение больше текущего, идем по правой ветке
        {
            if (this.Right == null) //если правой ветки не было, то создаем ее и оставляем новый элемент здесь
                this.Right = new Node<T>(value);
           else //если правая ветка уже есть, то входим в нее и продолжаем дальше искать пустую ветку
                this.Right.Add(value);
        }
    }
}



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
chupachups
Дата 17.11.2016, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 15.10.2008

Репутация: нет
Всего: 1



тогда само дерево будет таким:
Код

/// <summary>
/// общий класс для дерева из всех элементов
/// </summary>
class BinaryTree<T> where T: IComparable
{
    public Node<T> root;

    /// <summary>
    /// добавление элемента
    /// </summary>
    public void Add(T new_value)
    {
        if (root == null) //инициализация корня, если его еще нет
            root = new Node<T>(new_value);
        else
            root.Add(new_value); //выборка куда добавлять следующий элемент, если корень уже есть
    }
}



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
chupachups
Дата 17.11.2016, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 15.10.2008

Репутация: нет
Всего: 1



тогда само дерево будет таким:
Код

/// <summary>
/// общий класс для дерева из всех элементов
/// </summary>
class BinaryTree<T> where T
{
    public Node<T> root;

    /// <summary>
    /// добавление элемента
    /// </summary>
    public void Add(T new_value)
    {
        if (root == null) //инициализация корня, если его еще нет
            root = new Node<T>(new_value);
        else
            root.Add(new_value); //выборка куда добавлять следующий элемент, если корень уже есть
    }
}



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
chupachups
Дата 17.11.2016, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 15.10.2008

Репутация: нет
Всего: 1



тогда само дерево будет таким:
Код

/// <summary>
/// общий класс для дерева из всех элементов
/// </summary>
class BinaryTree<T> where T
{
    public Node<T> root;

    /// <summary>
    /// добавление элемента
    /// </summary>
    public void Add(T new_value)
    {
        if (root == null) //инициализация корня, если его еще нет
            root = new Node<T>(new_value);
        else
            root.Add(new_value); //выборка куда добавлять следующий элемент, если корень уже есть
    }
}



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
chupachups
Дата 17.11.2016, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 15.10.2008

Репутация: нет
Всего: 1



тогда само дерево будет таким:
Код

/// <summary>
/// общий класс для дерева из всех элементов
/// </summary>
class BinaryTree<T> where T
{
    public Node<T> root;

    /// <summary>
    /// добавление элемента
    /// </summary>
    public void Add(T new_value)
    {
        if (root == null) //инициализация корня, если его еще нет
            root = new Node<T>(new_value);
        else
            root.Add(new_value); //выборка куда добавлять следующий элемент, если корень уже есть
    }
}



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
chupachups
Дата 17.11.2016, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 15.10.2008

Репутация: нет
Всего: 1



тогда само дерево будет таким:
Код

/// <summary>
/// общий класс для дерева из всех элементов
/// </summary>
class BinaryTree<T> where T
{
    public Node<T> root;

    /// <summary>
    /// добавление элемента
    /// </summary>
    public void Add(T new_value)
    {
        if (root == null) //инициализация корня, если его еще нет
            root = new Node<T>(new_value);
        else
            root.Add(new_value); //выборка куда добавлять следующий элемент, если корень уже есть
    }
}



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
gypehot19
Дата 18.11.2016, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.6.2016

Репутация: нет
Всего: нет



Спасибо!

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
gypehot19
Дата 18.11.2016, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.6.2016

Репутация: нет
Всего: нет



Спасибо!

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
gypehot19
Дата 18.11.2016, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.6.2016

Репутация: нет
Всего: нет



Спасибо!

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
gypehot19
Дата 18.11.2016, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.6.2016

Репутация: нет
Всего: нет



Спасибо!

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1677 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.