Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

Бинарные деревья - операция добавление

11.08.2018, 15:05. Показов 2144. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
 
namespace MyCollections.Generic
{
    //Класс узла дерева.
    public class TreeNode<T> : IPrintable, ICloneableAs<TreeNode<T>>
    {
        public T Value { get; set; }
        public TreeNode<T> Left { get; set; }
        public TreeNode<T> Right { get; set; }
 
        public TreeNode(T value = default(T), TreeNode<T> left  = null, TreeNode<T> right  = null)
        {
            Value = value;
            Left = left;
            Right = right;
        }
 
        public string GetStringRepresentation() => Value.ToString();
 
        public void Print() => Console.Write(GetStringRepresentation());
 
        public void Println() => Console.WriteLine(GetStringRepresentation());
 
        public TreeNode<T> CloneAs() => new TreeNode<T>(Value, Left, Right);
 
        public virtual object Clone() => CloneAs();
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System;
 
namespace MyCollections.Generic
{
    //Класс бинарного дерева поиска.
    public class BinaryTree<T> //: IPrintable
        where T: IComparable<T>
    {
        private TreeNode<T> Find(TreeNode<T> root, T x)
        {
            if (root != null)
            {
                if (root.Value.CompareTo(x) == 0)
                {
                    return root;
                }
                else
                {
                    if (root.Value.CompareTo(x) > 0)
                    {
                        return Find(root.Left, x);
                    }
                    else
                    {
                        return Find(root.Right, x);
                    }
                }
            }
            return null;
        }
 
        private void Include(ref TreeNode<T> root, T x)
        {
            if (root == null)
            {
                root = new TreeNode<T>(x);
            }
            else
            {
                if (root.Value.CompareTo(x) > 0)
                {
                    Include(ref root.Left, x);
                }
                else
                {
                    if (root.Value.CompareTo(x) < 0)
                    {
                        Include(ref root.Left, x);
                    }
                    else
                    {
                        return;
                    }
                }
            }
        }
 
        public TreeNode<T> Root { get; private set; }
 
        public TreeNode<T> Find(T x) => Find(Root, x);
 
    }
}
Выдает:
exit status 1
MyCollections/Generic/BinaryTree.cs(42,23): error CS0206: A property, indexer or dynamic member access may not be passed as `ref' or `out' parameter
MyCollections/Generic/BinaryTree.cs(48,24): error CS0206: A property, indexer or dynamic member access may not be passed as `ref' or `out' parameter
Compilation failed: 2 error(s), 0 warnings
Как мне исправить ошибку? (Использовать поля публичные вместо свойств как-то не очень хочется.)

Добавлено через 2 часа 11 минут
Актуально.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.08.2018, 15:05
Ответы с готовыми решениями:

Бинарные деревья
Составить программу, которая создает из заданного множества 32, 8, 17, 25, 78, 35, 16, 34, 3, 91 бинарное дерево. И выполнить обход...

Бинарные деревья поиска
Доброй ночи, помогите пожалуйста разобраться в коде, я его нашел в интернете: class Tree&lt;T&gt; where T: IComparable { ...

Начертите бинарные деревья поиска высотой 2,3,4,5 и 6 для множества ключей
Помогите пожалуйста написать код по данной задаче и прокомментировать каждое действие, ни как не могу - нормально разобрать данный раздел ....

9
36 / 34 / 13
Регистрация: 03.06.2010
Сообщений: 215
11.08.2018, 16:06
Можно, определенно без ref, не знаю как в этом решении, но как пример http://flash2048.com/post/bin-tree
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private void Include(TreeNode<T> root, T x)
        {
            if (root == null)
            {
                root = new TreeNode<T>(x);
            }
            else
            {
                if (root.Value.CompareTo(x) > 0)
                {
                    Include(root.Left, x);
                }
                else
                {
                    if (root.Value.CompareTo(x) < 0)
                    {
                        Include(root.Left, x);
                    }
                    else
                    {
                        return;
                    }
                }
            }
        }
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
11.08.2018, 16:29  [ТС]
Ren Trapnest, без ref:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
 
class MainClass
{
    public class T
    {
        public int id;
 
        public T(int id)
        {
            this.id = id;
        }
    }
 
    public static void Change(T x) => x = new T(x.id + 1);
 
    public static void Main (string[] args)
    {
        T x = new T(1);
    Console.WriteLine(x.id);
        Change(x);
        Console.WriteLine(x.id);
  }
}
Вывод:
1
1
А с ref:
1
2
Добавлено через 1 минуту

Не по теме:

Извиняюсь за кривое форматирование - так вставилось.



Добавлено через 11 минут
Еще есть предложения?
0
36 / 34 / 13
Регистрация: 03.06.2010
Сообщений: 215
11.08.2018, 17:12
Исправьте возвращаемый тип с void на T
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
public static void Change(T x) => x = new T(x.id + 1);
И в Main попробуйте так:
C#
1
2
3
4
5
6
7
public static void Main (string[] args)
    {
        T x = new T(1);
        Console.WriteLine(x.id);
        x = Change(x);
        Console.WriteLine(x.id);
  }
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
11.08.2018, 17:16  [ТС]
Ren Trapnest, это понятное дело. А вот что делать с моим деревом? Можно сделать internal-поля, и связанные с ними свойства в TreeNode<T>. Как такой вариант решения?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
11.08.2018, 18:14
Лучший ответ Сообщение было отмечено Соколиный глаз как решение

Решение

Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Можно сделать internal-поля
private поле. internal здесь не нужен.

Добавлено через 35 секунд
Стоп. Это же разные классы.

Добавлено через 14 минут
Как вариант
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public void Include(T x)
{
    if (_root == null)
    {
        _root = new TreeNode<T>(x);
    }
    else
    {
        Include(_root, x);
    }
}
 
private void Include(TreeNode<T> root, T x)
{
    int result = root.Value.CompareTo(x);
    if (result > 0)
    {
        if (root.Left == null)
            root.Left = new TreeNode<T>(x);
        else
            Include(root.Left, x);
    }
    else if (result < 0)
    {
        if (root.Right == null)
            root.Right = new TreeNode<T>(x);
        else
            Include(root.Right, x);
    }
}
Добавлено через 20 минут
И еще с ref. Метод Include был добавлен в TreeMode
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public class BinaryTree<T> //: IPrintable
    where T: IComparable<T>
{
    BinaryTreeNode<T> _root;
 
    public void Include(T x)
    {
        if (_root == null)
        {
            _root = new TreeNode<T>(x);
        }
        else
        {
            _root.Include(x);
        }
    }
 
    ...
}
 
public class TreeNode<T> : IPrintable, ICloneableAs<TreeNode<T>>
    where T: IComparable<T>
{
    public T Value { get; set; }
 
    private TreeNode<T> _left, _right;
    public TreeNode<T> Left { get => _left; set => _left = value; }
    public TreeNode<T> Right { get => _right; set => _right = value; }
 
    public void Include(T x)
    {
        int result = Value.CompareTo(x);
        if (result > 0)
            Include(ref _left, x);
        else if (result < 0)
            Include(ref _right, x);
    }
 
    private static void Include(ref TreeNode<T> root, T x)
    {
        if (root == null)
        {
            root = new TreeNode<T>(x);
        }
        else
        {
            int result = root.Value.CompareTo(x);
            if (result > 0)
                Include(ref root._left, x);
            else if (result < 0)
                Include(ref root._right, x);
        }
    }
}
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
12.08.2018, 21:57  [ТС]
OwenGlendower, вариант с internal-полями мне не очень и нравился (хотя я его и предложил) - слишком, на мой взгляд, доступными поля оказываются.

Добавлено через 9 часов 7 минут
OwenGlendower, как я понял для удаления узла придется также рассматривать случай с головой отдельно (если требуется использовать свойства)?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
13.08.2018, 10:37
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
как я понял для удаления узла придется также рассматривать случай с головой отдельно (если требуется использовать свойства)?
Не понял какая свзяь между проверкой головы и свойствами.
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
13.08.2018, 13:18  [ТС]
OwenGlendower, ну, свойства же нельзя передавать по ссылке. Поэтому с ними требуются дополнительные выкрутасы.

Добавлено через 5 минут
OwenGlendower, но с другой стороны можно попробовать использовать поля для внутренних структур данных. Как Вы на это смотрите? В том же TreeNode<T> можно использовать поля, но меня смущает то, что в .Net используют свойства в основном.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
13.08.2018, 13:20
Соколиный глаз, значит нужно переписать алгоритм без использования ref или использовать поле. Выше показаны оба варианта.

Добавлено через 1 минуту
Уточнение - говоря про поля я имею в виду вариант с private полем и public свойством которое его использует. Полностью от свойств отказываться не надо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.08.2018, 13:20
Помогаю со студенческими работами здесь

Где можно почитать про связные списки и бинарные деревья
Ребят подскажите литературу, сайты где можно почитать про связные списки, бинарные деревья.. как это все реализовать в C#. Что-то мои...

Бинарные деревья
Кому не лень. Скачал проект-библиотека в котором три класса. Главные вопрос: Каким образом создать дерево (код) и как вообще будет...

Бинарные деревья - названия операция
Как обычно называют операции добавления и удаления элементов в бинарное дерево? Include &amp; Exclude?

Бинарные деревья
Определить наличие на каком-либо из путей от корня до листа хотя бы двух узлов с одинаковым именем. ?- pred(a(f(a(m,k),r),n)). yes ...

Бинарные деревья
Бинарные деревья задаются с помощью тернарного функтора tree(Left,Root,Right), где Root - элемент, находящийся в вершине, а Left и Right...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru