Алгоритм поиска с возвратом и обхода дерева.

(открыть в новой вкладке)

Условие:

Нужно создать структуру данных к дереву.

Дерево:


И написать два алгоритма для прямого и обратного обхода дерева с выводом данных для каждого узла.

Прямой и обратный обход:



Код:

"""ПРИМЕР ПОДРОБНОЙ ЗАПИСИ ДЕРЕВА. НОВАЯ СТРУКТУРА ДАННЫХ - "ДЕРЕВО"."""
# здесь описаны все узлы
root = { "data": "A", "children": [] }
node2 = { "data": "B", "children": [] }
node3 = { "data": "C", "children": [] }
node4 = { "data": "D", "children": [] }
node5 = { "data": "E", "children": [] }
node6 = { "data": "F", "children": [] }
node7 = { "data": "G", "children": [] }
node8 = { "data": "H", "children": [] }

# здесь описаны, только те узлы, у которых есть дети. По-другому, те узлы, которые не будут являться базовыми случаями (листьями дерева).
root["children"] = [node2, node3]
node2["children"] = [node4]
node3["children"] = [node5, node6]
node5["children"] = [node7, node8]

###################################################################################################################################
# Весь код выше создаст новую структуру данных, кот. очень сложно записать другим более коротким вариантом без ошибок.
# Вот такая запись получается после исполнения кода --> {'data': 'A', 'children': [{'data': 'B', 'children': [{'data': 'D', 'children': []}]}, {'data': 'C', 'children': [{'data': 'E', 'children': [{'data': 'G', 'children': []}, {'data': 'H', 'children': []}]}, {'data': 'F', 'children': []}]}]}
# Записать такое в приведённом коротком варианте очень сложно без ошибок!!!
###################################################################################################################################

"""ПРЯМОЙ ОБХОД ДЕРЕВА. 
Вывод значений по факту сборки стека. 
Если представить, что стек собирается и разбирается, то здесь ситуация иная: вызовы как бы расходятся по ветвям дерева и угасают (функция возвращает None).
Базовый случай всегда происходит на последнем этапе работы функции, когда она возвращается."""

def straight(node):
    print(node["data"], end=" ")                                                    # печатаем данные узла
    if len(node["children"]) > 0:                                                   # это рекурсивный случай, в узле котором есть дочерние элементы
        for child in node["children"]:
            straight(child)
    # Базовый случай не нужен
    return

print()
straight(root)                                                                      # вызов функции прямого обхода дерева
print("\n")

###################################################################################################################################

"""ОБРАТНЫЙ ОБХОД ДЕРЕВА. 
Вывод значений по факту разборки стека."""

def straight(node):
    for child in node["children"]:
        straight(child)
    print(node["data"], end=" ")                                                    # печатаем данные узла      
    # Базовый случай не нужен
    return

print()
straight(root)                                                                      # вызов функции прямого обхода дерева
print("\n")