Приведенный выше псевдокод перебирает Дерево , которое является структурой данных.
Рекурсивные функции - это функции, которые вызывают себя до тех пор, пока не будет выполнено условие завершения.
В дереве есть один корневой узел, и у него будут левый и правый дочерние узлы, у каждого из них могут быть одинаковые правый и левый дочерние узлы (или может не быть или иметь левый или правый дочерний элемент).
Если, скажем, у какого-либо дочернего элемента (или корневого элемента) нет правильного дочернего элемента, то правый дочерний элемент будет нулевым, то же самое верно для левого дочернего элемента.
Таким образом, приведенный выше код называет себя двумяраз, один раз для итерации по левой ветви и второй для итерации по правой ветви.
Я попытаюсь объяснить простым языком, вместо того, чтобы использовать множество технических терминов и запутанных концепций (сохранено просто):
давайте поговорим о левой ветви (например),
предположим, что теперь это похоже на ABCDE
, A is root
, первый вызов функции будет вызываться с помощью A as ref
, как этоЛевый дочерний элемент не равен нулю (то есть имеет детей), теперь он будет вызывать InOrderTraversal
с дочерним элементом A, т.е. B as ref
, в то время как наш вызов функции с ref-значением A хранится в call-stack
,
и снова, потомком B является C, который также не равен нулю, поэтому функция InOrderTraversal
вызывается снова с C's ref
, и call-stack
сохранит ссылку ref на вызов функции с ref B,
при этомСтек вызовов моментальных вызовов выглядит следующим образом:
InOrderTraversal(C)
InOrderTraversal(B)
InOrderTraversal(A)
, поэтому он продолжается до E, теперь у E нет дочернего элемента, поэтому он вернется к функции, которая его вызвала, то есть к вызову функции с помощью ссылки D, котораязатем вернитесь снова назад, и, наконец, мы перейдем к вызову основной функции, который сгенерировал все вызовы этой функции.
То же самое относится и к правой ветви.
Так что это возможно с call-stack
.
Я пытался объяснить ту часть, которая вас смущает.
Надеюсь, это поможет вам понять это.