class Node:
def __init__(self, node_id, parent_id, name, children=None):
self.id = node_id
self.parent_id = parent_id
self.name = name
self.children = children if children is not None else []
def получить_родителя(self, nodes):
"""Возвращает родительский узел."""
if self.parent_id is None:
return None
for node in nodes:
if node.id == self.parent_id:
return node
return None
def получить_наследников(self):
"""Возвращает список наследников."""
return self.children
def проверить_корень_ли_я(self):
"""Проверяет, является ли узел корневым."""
return self.parent_id is None
def добавить_наследника(self, child_node):
"""Добавляет наследника."""
self.children.append(child_node)
def удалить_наследника(self, child_id):
"""Удаляет наследника по его id."""
self.children = [child for child in self.children if child.id != child_id]
def __repr__(self):
return f"Node(id={self.id}, parent_id={self.parent_id}, name='{self.name}', children={self.children})"
# Функция для построения дерева и сбора всех узлов
def build_tree(json_data):
"""Строит дерево из JSON-данных и возвращает список всех узлов."""
nodes = {}
def _build_tree(data):
for item in data:
node = Node(item['id'], item['parentId'], item['name'])
nodes[node.id] = node
if 'children' in item and item['children']:
node.children = _build_tree(item['children'])
return list(nodes.values())
_build_tree(json_data)
return nodes
# Пример JSON-данных
json_data = [
{
"id": 1,
"parentId": None,
"name": "Root",
"children": [
{
"id": 2,
"parentId": 1,
"name": "Section A",
"children": [
{
"id": 4,
"parentId": 2,
"name": "Page 1",
"children": []
},
{
"id": 5,
"parentId": 2,
"name": "Page 2",
"children": []
}
]
},
{
"id": 3,
"parentId": 1,
"name": "Section B",
"children": [
{
"id": 6,
"parentId": 3,
"name": "Page 3",
"children": []
}
]
}
]
}
]
# Построение дерева и получение всех узлов
all_nodes = build_tree(json_data)
# Пример работы с узлами
root_node = all_nodes[1] # Корневой узел с id = 1
section_a = all_nodes[2] # Узел Section A с id = 2
page_1 = all_nodes[4] # Узел Page 1 с id = 4
print(root_node.проверить_корень_ли_я()) # True
print(section_a.проверить_корень_ли_я()) # False
print(section_a.получить_родителя(all_nodes.values()).name) # Root
print(page_1.получить_родителя(all_nodes.values()).name) # Section A
# Добавление нового наследника
new_page = Node(7, 2, "Page 4")
section_a.добавить_наследника(new_page)
print(section_a.получить_наследников()) # [Node(id=4, ...), Node(id=5, ...), Node(id=7, ...)]
# Удаление наследника
section_a.удалить_наследника(5)
print(section_a.получить_наследников()) # [Node(id=4, ...), Node(id=7, ...)]