Quando utilizzare Pre-Order, In-Order e Post-Order Traversal Strategy
Prima di poter capire in quali circostanze utilizzare il pre-ordine, l'ordine in ordine e il post-ordine per un albero binario, devi capire esattamente come funziona ciascuna strategia di attraversamento. Usa il seguente albero come esempio.
La radice dell'albero è 7 , il nodo più a sinistra è 0 , il nodo più a destra è 10 .
Attraversamento pre-ordine :
Riepilogo: inizia dalla radice ( 7 ), termina al nodo più a destra ( 10 )
Sequenza trasversale: 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10
Attraversamento in ordine :
Riepilogo: inizia dal nodo più a sinistra ( 0 ), termina nel nodo più a destra ( 10 )
Sequenza trasversale: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Attraversamento post-ordine :
Riepilogo: inizia con il nodo più a sinistra ( 0 ), termina con la radice ( 7 )
Sequenza trasversale: 0, 2, 4, 6, 5, 3, 1, 8, 10, 9, 7
Quando utilizzare Pre-Order, In-order o Post-Order?
La strategia di attraversamento selezionata dal programmatore dipende dalle esigenze specifiche dell'algoritmo progettato. L'obiettivo è la velocità, quindi scegli la strategia che ti porta i nodi di cui hai bisogno più velocemente.
Se sai che devi esplorare le radici prima di ispezionare le foglie, scegli il preordine perché incontrerai tutte le radici prima di tutte le foglie.
Se sai che devi esplorare tutte le foglie prima di qualsiasi nodo, seleziona il post-ordine perché non perdi tempo a ispezionare le radici alla ricerca di foglie.
Se sai che l'albero ha una sequenza intrinseca nei nodi e vuoi appiattire l'albero nella sua sequenza originale, allora dovresti usare un attraversamento in ordine . L'albero verrebbe appiattito nello stesso modo in cui è stato creato. Un attraversamento di pre-ordine o post-ordine potrebbe non svolgere nuovamente l'albero nella sequenza utilizzata per crearlo.
Algoritmi ricorsivi per pre-ordine, in-order e post-order (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
}