Quando usar a estratégia de pré-pedido, pedido e pós-pedido transversal
Antes que você possa entender sob quais circunstâncias usar a pré-ordem, a ordem e a pós-ordem para uma árvore binária, você precisa entender exatamente como cada estratégia de passagem funciona. Use a seguinte árvore como exemplo.
A raiz da árvore é 7 , o nó mais à esquerda é 0 , o nó mais à direita é 10 .
Traversal de pré-encomenda :
Resumo: começa na raiz ( 7 ), termina no nó mais à direita ( 10 )
Sequência transversal: 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10
Percurso em ordem :
Resumo: começa no nó mais à esquerda ( 0 ), termina no nó mais à direita ( 10 )
Sequência transversal: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Traversal pós-pedido :
Resumo: começa com o nó mais à esquerda ( 0 ), termina com a raiz ( 7 )
Sequência transversal: 0, 2, 4, 6, 5, 3, 1, 8, 10, 9, 7
Quando usar a pré-encomenda, encomenda ou pós-encomenda?
A estratégia de passagem que o programador seleciona depende das necessidades específicas do algoritmo que está sendo projetado. O objetivo é a velocidade, então escolha a estratégia que traz os nós de que você precisa com mais rapidez.
Se você sabe que precisa explorar as raízes antes de inspecionar as folhas, faça uma pré-encomenda porque encontrará todas as raízes antes de todas as folhas.
Se você sabe que precisa explorar todas as folhas antes de qualquer nó, selecione pós-pedido porque não perde tempo inspecionando raízes em busca de folhas.
Se você sabe que a árvore tem uma sequência inerente nos nós e deseja achatar a árvore de volta à sua sequência original, uma travessia em ordem deve ser usada. A árvore seria achatada da mesma forma que foi criada. Uma passagem de pré-pedido ou pós-pedido pode não desdobrar a árvore de volta à sequência que foi usada para criá-la.
Algoritmos recursivos para pré-pedido, pedido e pós-pedido (C ++):
struct Node{
int data;
Node *left, *right;
};
void preOrderPrint(Node *root)
{
print(root->name); //record root
if (root->left != NULL) preOrderPrint(root->left); //traverse left if exists
if (root->right != NULL) preOrderPrint(root->right);//traverse right if exists
}
void inOrderPrint(Node *root)
{
if (root.left != NULL) inOrderPrint(root->left); //traverse left if exists
print(root->name); //record root
if (root.right != NULL) inOrderPrint(root->right); //traverse right if exists
}
void postOrderPrint(Node *root)
{
if (root->left != NULL) postOrderPrint(root->left); //traverse left if exists
if (root->right != NULL) postOrderPrint(root->right);//traverse right if exists
print(root->name); //record root
}