Если я правильно читаю алгоритм, это должно быть примером того, как он работает:
X
/ \
Y Z
/ \ / \
A B C D
Во-первых, X
- это корень, поэтому он инициализируется как current
.У X
есть левый потомок, поэтому X
становится самым правым правым потомком левого поддерева X
- непосредственного предшественника X
в обходе по порядку.Таким образом, X
становится правильным потомком B
, тогда current
устанавливается на Y
.Дерево теперь выглядит так:
Y
/ \
A B
\
X
/ \
(Y) Z
/ \
C D
(Y)
выше относится к Y
и всем его дочерним элементам, которые опущены для проблем рекурсии.В любом случае важная часть указана.Теперь, когда дерево имеет ссылку на X, обход продолжается ...
A
\
Y
/ \
(A) B
\
X
/ \
(Y) Z
/ \
C D
Затем выводится A
, поскольку у него нет левого потомка, а current
возвращается в Y
, который был сделан правым потомком A
в предыдущей итерации.На следующей итерации Y имеет обоих потомков.Тем не менее, двойное условие цикла заставляет его останавливаться, когда он достигает себя, что указывает на то, что его левое поддерево уже пройдено.Таким образом, он печатает сам и продолжает свое правое поддерево, которое B
.
B
печатает себя, а затем current
становится X
, что проходит тот же процесс проверки, что и Y
сделал, также понимая, что его левое поддерево было пройдено, продолжая с Z
.Остальная часть дерева следует той же схеме.
Никакой рекурсии не требуется, потому что вместо того, чтобы полагаться на возврат по стеку, ссылка на корень (под) дерева перемещается в точку, в которойв любом случае он будет доступен в алгоритме обхода дерева рекурсивного порядка - после того, как закончится его левое поддерево.