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

AVL-деревья - вставка узла

29.08.2018, 21:09. Показов 1454. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
AVLTreeNode<T>:
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
using System;
 
namespace MyCollections.Generic
{
    //Класс узла AVL-дерева.
    public class AVLTreeNode<T> : TreeNode<T>, IPrintable, ICloneableAs<AVLTreeNode<T>>
    {
        public new AVLTreeNode<T> left;
        public new AVLTreeNode<T> right;
        public new AVLTreeNode<T> parent;
        public int balance;
 
        public AVLTreeNode(T value = default(T), AVLTreeNode<T> left  = null, AVLTreeNode<T> right  = null, AVLTreeNode<T> parent = null)
        {
            this.value = value;
            this.left = left;
            this.right = right;
            this.parent = parent;
        }
 
        public new AVLTreeNode<T> CloneAs() => new AVLTreeNode<T>(value, left, right, parent);
 
        public override object Clone() => CloneAs();
    }
}
AVLTree<T>:
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
using System;
using System.Collections.Generic;
 
namespace MyCollections.Generic
{
    //Класс ALV-дерева поиска.
    public class AVLTree<T> : IPrintable
    {
        private AVLTreeNode<T> root;
 
        private AVLTreeNode<T> Find(AVLTreeNode<T> root, T x)
        {
            if (root != null)
            {
                if (Comparer.Compare(x, root.value) < 0)
                {
                    return Find(root.left, x);
                }
                else if (Comparer.Compare(x, root.value) > 0)
                {
                    return Find(root.right, x);
                }
                else
                {
                    return root;
                }
            }
            return null;
        }
 
        private void RotateRight(ref AVLTreeNode<T> root)
        {
            AVLTreeNode<T> leftNode = root.left;
            root.left = leftNode.right;
            root.left.parent = root;
 
            leftNode.parent = root.parent;
 
            leftNode.right = root;
            root.parent = leftNode;
 
            root = leftNode;
 
            root.right.balance = root.right.balance - 1 + Math.Min(-root.balance, 0);
            root.balance = root.balance - 1 + Math.Min(0, root.right.balance);
        }
 
        private void RotateLeft(ref AVLTreeNode<T> root)
        {
            AVLTreeNode<T> rightNode = root.right;
            root.right = rightNode.left;
            root.right.parent = root;
 
            rightNode.parent = root.parent;
 
            rightNode.left = root;
            root.parent = rightNode;
 
            root = rightNode;
 
            root.left.balance = root.left.balance + 1 - Math.Min(0, -root.balance);
            root.balance = root.balance + 1 + Math.Max(root.left.balance, 0);
        }
 
        private void RotateRightLeft(ref AVLTreeNode<T> root)
        {
            RotateRight(ref root.right);
            RotateLeft(ref root);
        }
 
        private void RotateLeftRight(ref AVLTreeNode<T> root)
        {
            RotateLeft(ref root.left);
            RotateRight(ref root);
        }
 
        private void Insert(AVLTreeNode<T> previous, ref AVLTreeNode<T> root, T x)
        {
            if (root == null)
            {
                root = new AVLTreeNode<T>(x);
                root.parent = previous;
            }
            else
            {
                if (Comparer.Compare(root.value, x) > 0)
                {
                    Insert(root, ref root.left, x);
                }
                else if (Comparer.Compare(root.value, x) < 0)
                {
                    Insert(root, ref root.right, x);
                }
                else
                {
                    return;
                }
            }
        }
 
        private void GetStringRepresentation(AVLTreeNode<T> root, ref string representation)
        {
            if (root != null)
            {
                representation += $"{root.value}, ";
                GetStringRepresentation(root.left, ref representation);
                GetStringRepresentation(root.right, ref representation);
            }
        }
 
        public IComparer<T> Comparer { get; private set; }
        public AVLTreeNode<T> Root => root;
        public int Count { get; private set; }
 
        public AVLTree(IComparer<T> comparer)
        {
            Comparer = comparer;
        }
 
        public AVLTree() : this(Comparer<T>.Default)
        {
        }
 
        public string GetStringRepresentation()
        {
            string representation = "{";
            GetStringRepresentation(root, ref representation);
            if (representation.Length > 1)
            {
                representation = representation.Substring(0, representation.Length - 2);
            }
            representation += "}";
            return representation;
        }
 
        public void Print() => Console.Write(GetStringRepresentation());
 
        public void Println() => Console.WriteLine(GetStringRepresentation());
 
        public AVLTreeNode<T> Find(T x) => Find(root, x);
    }
}
Как теперь сделать вставку узла с балансировкой, если алгоритм такой:
1) Вставить узел как в обычное BST.
2) Менять балансы предков до тех пор, пока не найдется первый разбалансированный.
3) Применить к этому предку вращение и закончить алгоритм.
?

Добавлено через 3 часа 24 минуты
Тема актуальна.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2018, 21:09
Ответы с готовыми решениями:

Вставка в AVL дерево
реализовать задачу по вставке в AVL дерево на С#

Вставка нового узла в бинарное дерево
Подскажите можно ли как-то реализовать, чтобы в консоле можно было вставлять новый узел, нахождение...

Поиск узла в XML и вставка его в TreeView
Как сделать проверку что узел с такой то позицией есть в XML файле, и если узел есть в XML то...

AVL-деревья - вычисление баланса узла
Баланс узла обычно вычисляется как разность высот левого и правого дерева или наоборот? ...

10
315 / 244 / 149
Регистрация: 03.10.2017
Сообщений: 886
Записей в блоге: 1
29.08.2018, 21:22 2
А в чём собственно вопрос. У вас есть алгоритм, что вам именно не понятно
0
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
29.08.2018, 21:26  [ТС] 3
Masson1848, вопрос в том как этот алгоритм лучше реализовать. Мне нужно, чтобы мне показали как это сделать примером кода. А дальше - буду стараться сам.
0
315 / 244 / 149
Регистрация: 03.10.2017
Сообщений: 886
Записей в блоге: 1
29.08.2018, 21:31 4
Пдф-ка с гиперссылками, там найди раздел АВЛ-Деревья
Vse_Voprosy_vosstanovlen.pdf
1
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
29.08.2018, 21:35  [ТС] 5
Если более чётко сформулировать мою проблему, то так:
Методы, выполняющие повороты получают входным параметром переменную-узел по ссылке. Предположим, что я добавил узел. А как мне теперь передать его по ссылке в другой метод, чтобы искался такой предок, где нужна балансировка? И загвоздка в том, что этим предком может быть root (самый главный корень).
Как эту проблему решить? Если не в другом методе делать поиск предка для балансировки, то как сделать лучше?
0
315 / 244 / 149
Регистрация: 03.10.2017
Сообщений: 886
Записей в блоге: 1
29.08.2018, 21:39 6
А разделить на два метода? Сначала добавить узел. А потом отбалансировать?
0
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
29.08.2018, 21:40  [ТС] 7
Допустим я так сделаю. У меня уже есть метод вставки (без балансировки). Но как в другом методе я передам этот добавленный узел по ссылке? Тот же root теоретически может быть изменен - пересбалансирован.
0
315 / 244 / 149
Регистрация: 03.10.2017
Сообщений: 886
Записей в блоге: 1
29.08.2018, 21:43 8
Так, ты вставляешь узел. У тебя получается новое дерево. Вот его и передаешь на балансировку.
0
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
29.08.2018, 21:48  [ТС] 9
Хорошо. Точнее, мне требуется возврат по ссылке? Точнее так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
 
class A()
{
}
 
class MainClass
{
  public static ref A Method()
  {
    A x = new A();
    return ref x;
  }
  public static void Main (string[] args)
  {
    ref A x = ref Method();
  }
}
? Но тут ошибка:
main.cs(3,8): error CS1644: Feature `primary constructor' cannot be used because it is not part of the C# 7.0 language specification
. Как поправить?

Добавлено через 58 секунд
Цитата Сообщение от Masson1848 Посмотреть сообщение
Вот его и передаешь на балансировку.
А сможет ли root измениться, если я передам предок добавленного узла для балансировки? Я же не root по ссылке передаю.
0
Masson1848
29.08.2018, 21:54
  #10

Не по теме:

Я помог, чем смог. Дальше ты сам, я уже сплю.

0
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
29.08.2018, 21:54  [ТС] 11
Спасибо тебе. Но, все-же, вопрос остается открытым.
0
29.08.2018, 21:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.08.2018, 21:54
Помогаю со студенческими работами здесь

Удаление узла из AVL-дерева
Почему можно так (стр 28) сделать ? Добавлено через 2 минуты Как вообще может найтись такой...

AVL - деревья
http://algcourse.cs.msu.su/wp-content/uploads/2010/09/Сбалансированные-деревья-поиска.pdf Вопрос...

AVL-деревья
Правильно ли я понимаю, что удаление узла X из AVL-дерева состоит из следующих частей: 1) само...

Правый поворот [AVL-деревья]
Цитата из О.В. Сенюкова СБАЛАНСИРОВАННЫЕ ДЕРЕВЬЯ ПОИСКА: А в другом источнике такой код: struct...

AVL-деревья - высота пустых деревьев
Высота пустого AVL-дерева обычно принимается за -1 или за 0?

AVL-деревья - не вижу высоты у деревьев
Почему тут: type AVLTree = ^AVLNode; AVLNode = record key: key_type; left:...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru