A
- это обход по предварительному заказу, тогда как B
- это обход по порядку.
Простой способ определить порядок печати - посмотреть, как вы посещаетесами узлы.Я обычно рисую контур вокруг дерева (начиная с корня и двигаясь по левому или правому краю, основываясь на поддереве, которое вы сначала просматриваете).Если я делаю обход по предварительному заказу, я распечатываю узел всякий раз, когда перемещаюсь по его внешней стороне .Если я выполняю обход в порядке, я распечатываю узел только тогда, когда я перемещаю в (это имеет смысл, когда вы смотрите обходы в порядке, потому что вы заканчиваете тем, что сначала печатаете листья; онипервые узлы, которые вы перемещаете в при рисовании контура).Если я выполняю обход после заказа, я распечатываю узел только тогда, когда я двигаюсь вдоль его внутри .
ОБНОВЛЕНИЕ
Причина30 распечатывается после 5 и 8, если вы не выполняете чисто предварительный обход.Вы перепрыгиваете между предзаказом и обходом по порядку.
Простой способ выяснить порядок - это фактически записать шаги, через которые проходит ваш код, когда вы проходите через него (я часто используюручка / карандаш и бумага, чтобы хранить информацию вместе).Например, вы могли бы записать стек вызовов следующим образом:
A(60)
printf(60)
call B(60.left)
B(30)
call A(30.left)
A(5)
printf(5)
call B(5.left)
B(null)
call B(5.right)
B(8)
call A(8.left)
A(null)
printf(8)
call A(8.right)
A(null)
printf(30)
call A(30.right)
A(38)
...
Вы можете легко увидеть порядок, в котором печатаются узлы, и, что более важно, почему вы «переходите» с печати 8 напечать 30 (один рекурсивный вызов закончился, и вы отступаете на один уровень).