Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
 Аватар для SW Developer
97 / 93 / 81
Регистрация: 10.01.2016
Сообщений: 663
Записей в блоге: 13

Бинарное дерево

31.01.2021, 18:30. Показов 3226. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!

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
class BinaryTree:
    def __init__(self, root_obj):
        # корень
        self.root = root_obj
        # левый потомок
        self.left_child = None
        # правый потомок
        self.right_child = None
 
    # добавить левого потомка
    def insert_left(self, new_node):
        if new_node <= self.root:
            # если у узла нет левого потомка
            if self.left_child is None:
                # тогда узел просто вставляется в дерево
                # формируется новое поддерево
                self.left_child = BinaryTree(new_node)
            # если у узла есть левый потомок
            else:
                # тогда вставляем новый узел
                tree_obj = BinaryTree(new_node)
                # и спускаем имеющегося потомка на один уровень ниже
                tree_obj.left_child = self.left_child
                self.left_child = tree_obj
        else:
            return f'Error!'
 
    # добавить правого потомка
    def insert_right(self, new_node):
        # если у узла нет правого потомка
        if self.right_child is None:
            # тогда узел просто вставляется в дерево
            # формируется новое поддерево
            self.right_child = BinaryTree(new_node)
        # если у узла есть правый потомок
        else:
            # тогда вставляем новый узел
            tree_obj = BinaryTree(new_node)
            # и спускаем имеющегося потомка на один уровень ниже
            tree_obj.right_child = self.right_child
            self.right_child = tree_obj
 
    # метод доступа к правому потомку
    def get_right_child(self):
        return self.right_child
 
    # метод доступа к левому потомку
    def get_left_child(self):
        return self.left_child
 
    # метод установки корня
    def set_root_val(self, obj):
        self.root = obj
 
    # метод доступа к корню
    def get_root_val(self):
        try:
            return self.root
        except AttributeError:
            print('Error!')
 
 
r = BinaryTree(8)
print(r.get_root_val())
# print(r.get_left_child())
r.insert_left(9)
# print(r.get_left_child())
print(r.get_left_child().get_root_val())
r.insert_right(12)
# print(r.get_right_child())
print(r.get_right_child().get_root_val())
# r.get_right_child().set_root_val(16)
# print(r.get_right_child().get_root_val())
Выдает ошибку:
print(r.get_left_child().get_root_val())
AttributeError: 'NoneType' object has no attribute 'get_root_val'

Как исправить?

Стоит задача: настроить валидацию, т.е. чтобы выполнялись условия построения бинарного дерева. Если условия не выполняются, то выдать соответствующее сообщение.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.01.2021, 18:30
Ответы с готовыми решениями:

Бинарное дерево
Извиняюсь, если все плохо, но вот код, который следует подправить: class Tree: def __init__ (self, n): self.Name = n ...

Бинарное дерево
Необходимо построить сортирующее бинарное дерево, применить к нему процедуры обходов и результаты сохранить в файл. Как это можно...

Создать бинарное дерево
Помогите пожалуйста! Создать бинарное дерево и функции добавления, печати, сложения, сравнения

11
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 29
31.01.2021, 18:39
SW Developer, ты сам написал условие <= и нарушил принцип дзен
Errors should never pass silently.

у тебя 9 не меньше и не равно 8, соответственно возвращает еррор, но ты ее не видишь ибо нет принта. Бросай нормальное исключение, тогда сразу увидишь. Соответственно левый лист дерева не добавился и там Нан
0
 Аватар для SW Developer
97 / 93 / 81
Регистрация: 10.01.2016
Сообщений: 663
Записей в блоге: 13
31.01.2021, 18:48  [ТС]
Я знаю, что там Нан.
Цитата Сообщение от Welemir1 Посмотреть сообщение
Бросай нормальное исключение, тогда сразу увидишь.
Например?

Добавлено через 1 минуту
Цитата Сообщение от SW Developer Посмотреть сообщение
Python
1
2
3
4
5
6
# метод доступа к корню
    def get_root_val(self):
        try:
            return self.root
        except AttributeError:
            print('Error!')
Почему это не работает?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 29
31.01.2021, 18:50
SW Developer, например raise ValueError('тут текст мол не должно слева быть такого потомка')

обрати внимание, что у тебя логика правого и левого потмка не одинаковы. Что странно.

Цитата Сообщение от SW Developer Посмотреть сообщение
Я знаю, что там Нан.
тогда не понял в чем вопрос

Добавлено через 54 секунды
Цитата Сообщение от SW Developer Посмотреть сообщение
Почему это не работает?
давай как профессионалы -что не работает, как именно, что ожидал, что получил, ты же не яндекс лицеист, давай побольше контекста.
0
 Аватар для SW Developer
97 / 93 / 81
Регистрация: 10.01.2016
Сообщений: 663
Записей в блоге: 13
31.01.2021, 18:52  [ТС]
Цитата Сообщение от SW Developer Посмотреть сообщение
Python
1
print(r.get_left_child().get_root_val())
Здесь get_left_child() отрабатывает, а get_root_val() вызывает исключение.

Добавлено через 1 минуту
Цитата Сообщение от Welemir1 Посмотреть сообщение
обрати внимание, что у тебя логика правого и левого потмка не одинаковы.
Пока с левым экспериментирую.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 29
31.01.2021, 18:54
SW Developer, если ты про строку 68 соего кода то ничего там не отрабатывает. Вернее первая часть возвращает Нан, как у нан можно вызвать какую то функцию? у нан нет функций или атрибутов, потому функция гет_рут_вал даже не вызывается.

Добавлено через 1 минуту
то есть если ты ждал что нан попадет внутрь твоей функции там перехватится атрибут еррор и напечатает еррор, то нет, это не так работает. НаН ничего не знает ни про какую логику.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
31.01.2021, 18:54
Цитата Сообщение от SW Developer Посмотреть сообщение
Почему это не работает?
Потому что атрибут root у тебя есть.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 29
31.01.2021, 18:59
Цитата Сообщение от SW Developer Посмотреть сообщение
def get_root_val(self):
        try:
            return self.root
        except AttributeError:
            print('Error!')
то, что в ветке иксепт вообще сработает только в том редком случае, если ктото по глупости удалит рут.
1
 Аватар для SW Developer
97 / 93 / 81
Регистрация: 10.01.2016
Сообщений: 663
Записей в блоге: 13
31.01.2021, 19:02  [ТС]
Исправил:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    # добавить левого потомка
    def insert_left(self, new_node):
        if new_node <= self.root:
            # если у узла нет левого потомка
            if self.left_child is None:
                # тогда узел просто вставляется в дерево
                # формируется новое поддерево
                self.left_child = BinaryTree(new_node)
            # если у узла есть левый потомок
            else:
                # тогда вставляем новый узел
                tree_obj = BinaryTree(new_node)
                # и спускаем имеющегося потомка на один уровень ниже
                tree_obj.left_child = self.left_child
                self.left_child = tree_obj
        else:
            raise ValueError('Error!')
Python
1
2
3
    # метод доступа к корню
    def get_root_val(self):
        return self.root
Результат:

8
Traceback (most recent call last):
line 75, in <module>
r.insert_left(9)
line 38, in insert_left
raise ValueError('Error!')
ValueError: Error!
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
31.01.2021, 19:06
Вообще дерево должно состоять из класса Node и класса Tree.

Python
1
2
3
4
5
6
7
8
9
10
11
class Node:
    def __init__(self, val):
        self.l = None
        self.r = None
        self.v = val
 
class Tree:
    def __init__(self):
        self.root = None
 
...
Тогда не будет проблем пониманием того, что именно возвращается и какие свойства\атрибуты доступны.
2
 Аватар для SW Developer
97 / 93 / 81
Регистрация: 10.01.2016
Сообщений: 663
Записей в блоге: 13
31.01.2021, 19:10  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Вообще дерево должно состоять из класса Node и класса Tree.
Спасибо.
А как решить на данный момент возникшую проблемку, работая с одним классом: class BinaryTree?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
31.01.2021, 19:17
Посмотри правильную имплементацию: https://stackoverflow.com/ques... inary-tree
Править неправильную мне неинтересно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.01.2021, 19:17
Помогаю со студенческими работами здесь

Бинарное дерево. Граф. Поиск в ширину
Помогите интернет-магазину! Магазин имеет связь с социальной сетью, и когда кто-то покупает в ней какой-то товар, то эта информация...

Бинарное дерево(увеличить все ключи дерева на число k)
Составить программу, увеличивающую все ключи дерева на число k

Связной список / бинарное дерево
Здравствуйте. В университете получил проект имплементации бинарного дерева и связного списка (binary tree, linked list). Как можно это...

Реализовать бинарное дерево и обход по нему
Дано бинарное дерево. Найти самый длинный в дереве путь, проходящий только по вершинам с нечетными номерами. Нужно реализовать бинарное...

Исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру
Помогите, не могу понять!( Нужно исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру. вот...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru