В целом рекурсия заключается в поиске повторяющегося шаблона и экстраполяции его на более общее решение. Согласно Википедии:
«Рекурсия процесс повторяющихся элементов в автомодельного образом.»
Но это довольно расплывчаты и неконкретны определение Давайте вернемся к примерам
..
бинарное дерево очень повторяющаяся структура Рассмотрим это (почти) минимальный пример:.
![enter image description here](https://i.stack.imgur.com/noYbY.png)
Теперь представьте, что вы хотите посетить каждый узел в этом дереве, предполагая, что вы начинаете с корня. Кажется, довольно просто:
visit(l_child)
already in root
visit(r_child)
already in root
/ \
/ \
visit(l_child) visit(r_child)
Так в основном вы:
starting in the root →
visiting the left child →
getting back to the root →
visiting the right child →
getting back to the root.
Взгляните на другой пример бинарного дерева:
![enter image description here](https://i.stack.imgur.com/2Ylny.png)
Как вы можете видеть, что есть огромное сходство с предыдущей структурой. Теперь давайте посмотрим на каждый цветной узел:
visit(l_subtree)
already in root
visit(r_subtree)
Это точно такой же узор. Так как мы знаем, как пройти поддерева, мы можем думать о более общем алгоритме:
inorder(node):
if node == null: //we've reached the bottom of a binary tree
return 0
inorder(node.l_child)
do_something(node)
inorder(node.r_child)
И это весь алгоритм симметричного обхода. Я уверен, что вы сами можете сами понять, как писать псевдокод для предзаказов и постобработки.
Если рекурсия по-прежнему не интуитивно понятна, вы можете проверить это fractals example.
Вам нужна подсказка, как получить «рекурсивный образ мышления» на примере обхода двоичного дерева. Правильно ли я вас понимаю? –
да! или любое обход двоичного дерева – euniceblue