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

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

31.01.2021, 18:30. Показов 3183. Ответов 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
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 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
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 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
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 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
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru