Обход дерева обычно выполняется с помощью рекурсивных функций, потому что это наиболее естественный способ выражения обхода.
Выполнить предварительный заказ довольно просто. Игнорируя детали, у вас есть что-то вроде этого:
void do_preorder(Tree t)
{
// do something with the current tree node
if (leftnode(t) not empty)
do_preorder(leftnode(t));
if (rightnode(t) not empty)
do_preorder(rightnode(t))
}
Если вы хотите быть хитрым, вы можете даже создать общий обход, который позволит вам выбрать аромат (предварительный заказ, заказ или пост-заказ) во время выполнения:
void do_xorder(Tree t, Flavor f)
{
if (f == PREORDER)
handle_currentnode(t)
if (leftnode(t) not empty)
do_xorder(leftnode(t), f);
if (f == INORDER)
handle_currentnode(t)
if (rightnode(t) not empty)
do_xorder(rightnode(t), f)
if (f == POSTORDER)
handle_currentnode(t)
}