Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
2 / 2 / 1
Регистрация: 15.10.2015
Сообщений: 173

Обход деревьев. Двоичные Деревья. Балансировка

09.07.2016, 19:50. Показов 1454. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Скопировал этот код из учебника по балансировке AVL-дерева - при запуске ругается на отсутствие имени LinkedBinaryTree

Python
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
class TreeMap(LinkedBinaryTree, MapBase):
                class Position(LinkedBinaryTree.Position):
                                def key(self):
                                                  return self.element(). key
                                def value(self):
                                                return self.element(). value
                                def  _subtree_search(self, p, k):
                                                if k == p.key(): # found match
                                                                return p
                                                elif k < p.key(): # search left subtree
                                                                if self.left(p) is not None:
                                                                                return self._subtree_search(self.left(p), k)
                                                                else: # search right subtree
                                                                                if self.right(p) is not None:
                                                                                                return self._subtree_search(self.right(p), k)
                                                                                return p # unsucessful search
                                def  _subtree_fiist_position(self, p):
                                                walk = p
                                                while self.left(walk) is not None: # keep walking left
                                                                walk = self.left(walk)
                                                                return walk
                                def  _subtree_last_position(self, p):
                                                walk = p
                                                while self.right(walk) is not None: # keep walking right
                                                                walk = self.right(walk)
                                                return walk
                                def fiist(self):
                                                return self._subtree_1st_position(self.root()) if len(self) > 0 else None
                                def last(self):
                                                return self._subtree_last_position(self.root()) if len(self) > 0 else None
                                def before(self, p):
                                                self. validate(p) # inherited from LinkedBinaryTree
                                                if self.left(p):
                                                                return self._subtre_last_position(self.left(p))
                                                else:
# walk upward
                                                                walk = p
                                                                above = self.parent(walk)
                                                                while above is not None and walk == self.left(above):
                                                                                walk = above
                                                                                above = self.parent(walk)
                                                                return above
                                def after(self, p):
                                                self. validate(p) # inherited from LinkedBinaryTree
                                                if self.left(p):
                                                                return self._subtre_last_position(self.right(p))
                                                else:
                                                                walk = p
                                                                above = self.parent(walk)
                                                                while above is not None and walk == self.right(above):
                                                                                walk = above
                                                                                above = self.parent(walk)
                                                                return above
 
# symmetric to before(p)
                                def search_position(self, k):
                                                if self.is_empty():
                                                                return None
                                                else:
                                                                p = self._subtree_search(self.root(), k)
                                                                self._rebalance_access(p) # hook for balanced tree subclasses
                                                                return p
                                def search_min(self):
                                                if self.is_empty():
                                                                return None
                                                else:
                                                                p = self.fiist()
                                                                return (p.key(), p.value())
                                def search_ge(self, k):
                                                if self.is_empty():
                                                                return None
                                                else:
                                                                p = self.search_position(k) # may not find exact match
                                                                if p.key( ) < k: # p’s key is too small
                                                                                p = self.after(p)
                                                                return (p.key(), p.value()) if p is not None else None
                                def search_range(self, start, stop):
                                                if not self.is_empty():
                                                                if start is None:
                                                                                p = self.first()
                                                                else:
# we initialize p with logic similar to find ge
                                                                                p = self.search_position(start)
                                                                if p.key( ) < start:
                                                                                p = self.after(p)
                                                while p is not None and (stop is None or p.key( ) < stop):
                                                                yield (p.key(), p.value())
                                                                p = self.after(p)
                                def  __getitem__(self, k):
                                                if self.is_empty():
                                                                raise KeyError(+ repr(k))
                                                else:
                                                                p = self._subtree_search(self.root(), k)
                                                                self._rebalance_access(p) # hook for balanced tree subclasses
                                                                if k != p.key():
                                                                                raise KeyError(+ repr(k))
                                                                return p.value()
                                def __setitem__(self, k, v):
                                                if self.is_empty():
                                                                leaf = self._add_root(self. Item(k,v))          # from LinkedBinaryTree
                                                else:
                                                                p = self._subtree_search(self.root(), k)
                                                                if p.key( ) == k:
                                                                                p.element(). value = v # replace existing item’s value
                                                                                self._rebalanc_access(p) # hook for balanced tree subclasses
                                                                                return
                                                                else:
                                                                                item = self._Item(k,v)
                                                                                if p.key( ) < k:
                                                                                                leaf = self._ad_right(p, item)  # inherited from LinkedBinaryTree
                                                                                else:
                                                                                                leaf = self._add_left(p, item)   # inherited from LinkedBinaryTree
                                                                                                self._rebalance_insert(leaf) # hook for balanced tree subclasses
                                def  __iter__(self):
                                                p = self.first()
                                                while p is not None:
                                                                yield p.key()
                                                                p = self.after(p)
                                def delete(self, p):
                                                self._validate(p) # inherited from LinkedBinaryTree
                                                if self.left(p) and self.right(p): # p has two children
                                                                replacement = self_subtree_last_position(self.left(p))
                                                                self._replace(p, replacement.element())        # from LinkedBinaryTree
                                                                p =  replacement
                                                parent = self.parent(p)
                                                self._delete(p) # inherited from LinkedBinaryTree
                                                self._rebalance_delete(parent)
                                def __delitem__(self, k):
                                                if not self.is_empty():
                                                                p = self._subtree_search(self.root(), k)
                                                                if k == p.key():
                                                                                self.delete(p) # rely on positional version
                                                                                return # successful deletion complete
                                                                self._rebalance_access(p) # hook for balanced tree subclasses
                                                raise KeyError(+ repr(k))
                                def  _rebalance_insert(self, p): pass
                                def  _rebalance_delete(self, p): pass
                                def  _rebalance_access(self, p): pass
                                def  _relink(self, parent, child, make_left_child):
                                                if make_left_child: # make it a left child
                                                                parent._left = child
                                                else: # make it a right child
                                                                parent._right = child
                                                                if child is not None: # make child point to parent
                                                                                child._parent = parent
                                def  _rotate(self, p):
                                                x = p._node
                                                y = x._parent # we assume this exists
                                                z = y._parent # grandparent (possibly None)
                                                if z is None:
                                                                self._root = x # x becomes root
                                                                x._parent = None
                                                else:
                                                                self._relink(z, x, y == z. left)          # x becomes a direct child of z
                                                                if x == y._left:
                                                                                self._relink(y, x. right, True) # x. right becomes left child of y
                                                                                self._relink(x, y, False) # y becomes right child of x
                                                                else:
                                                                                self._relink(y, x. left, False) # x. left becomes right child of y
                                                                                self._relink(x, y, True) # y becomes left child of x
                                def  _restructure(self, x):
                                                y = self.parent(x)
                                                z = self.parent(y)
                                                if (x == self.right(y)) == (y == self.right(z)):  # matching alignments
                                                                self._rotate(y) # single rotation (of y)
                                                                return y # y is new subtree root
                                                else: # opposite alignments
                                                                self. rotate(x) # double rotation (of x)
                                                                self. rotate(x)
                                                                return x # x is new subtree root
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.07.2016, 19:50
Ответы с готовыми решениями:

Двоичные деревья поиска
В общем, генерируется 10 чисел в промежутке от 0 до 50, 1 число - это корень(верхушка) цепочки, затем сравнивается 1 и 2 число, если оно...

Балансировка бинарных деревьев
Вот если кому то потребуется вылаживаю рабочую балансировку бинарных деревьев, если есть советы по улучшению то сс удовольствием выслушаю))...

Курсач по теме: Структуры данных. Двоичные деревья поиска. Красно-черные деревья
Здравствуйте, я первокурсник, преподавателя по информатике месяца 2 не было, потом появился, дал курсач, пару занятий провел и всё. Не...

2
 Аватар для Zuzik
298 / 256 / 57
Регистрация: 11.06.2012
Сообщений: 1,557
09.07.2016, 21:19
правильно, потому что данного класса у вас нет. Следовательно без него вы ничего сделать и не сможете. Читайте книгу внимательнее. скорее всего он там есть.
1
2 / 2 / 1
Регистрация: 15.10.2015
Сообщений: 173
09.07.2016, 21:54  [ТС]
Мне казалось , что если я создаю класс, значит он есть.
Т.е. я думал, что LinkedBinaryTree - это какой-то встроенный в Python класс
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.07.2016, 21:54
Помогаю со студенческими работами здесь

Двоичные деревья
Опишите процедуру, которая для заданного значения N строит дерево следующего вида: корнем является узел, информационная часть которого...

Двоичные Б-деревья
Здравствуйте. Помогите реализовать двоичное Б-дерево (вставка, удаление узла, балансировка) без применения ООП. Заранее благодарен.

Двоичные деревья!
Срочно нужно перейти на С++ (до этого прогил только на Делфи), нужен синтаксис реализации двоичного дерева на С++. Может кто-нибудь скинуть...

Двоичные деревья
Задача: Добавлено через 49 минут Решение.. (возможно неправильное) program Tree; uses crt; Type Tree=^uzel; uzel = Record...

Двоичные деревья
нужно сделать обработку текста (поиск, включение, удаление, чтение текста с заданным ключом в двоичном дереве). program Derewo; Type ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru