Kapan menggunakan Strategi Traversal Pre-Order, In-Order, dan Post-Order
Sebelum Anda dapat memahami dalam situasi apa menggunakan pre-order, in-order dan post-order untuk pohon biner, Anda harus memahami dengan tepat bagaimana setiap strategi traversal bekerja. Gunakan pohon berikut sebagai contoh.
Akar pohon adalah 7 , simpul paling kiri 0 , simpul paling kanan 10 .
Traversal praorder :
Ringkasan: Dimulai di root ( 7 ), berakhir di node paling kanan ( 10 )
Urutan traversal: 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10
Traversal berurutan :
Ringkasan: Dimulai di simpul paling kiri ( 0 ), berakhir di simpul paling kanan ( 10 )
Urutan Traversal: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Traversal pasca-pesanan :
Ringkasan: Diawali dengan simpul paling kiri ( 0 ), diakhiri dengan akar ( 7 )
Urutan traversal: 0, 2, 4, 6, 5, 3, 1, 8, 10, 9, 7
Kapan menggunakan Pre-Order, In-order atau Post-Order?
Strategi traversal yang dipilih programmer bergantung pada kebutuhan spesifik dari algoritma yang sedang dirancang. Tujuannya adalah kecepatan, jadi pilihlah strategi yang memberi Anda node yang paling cepat Anda butuhkan.
Jika Anda tahu bahwa Anda perlu menjelajahi akar sebelum memeriksa daun apa pun, Anda memilih pemesanan di muka karena Anda akan menemukan semua akar sebelum semua daun.
Jika Anda tahu Anda perlu menjelajahi semua daun sebelum ada node, Anda memilih pasca-pemesanan karena Anda tidak membuang waktu memeriksa akar untuk mencari daun.
Jika Anda mengetahui bahwa pohon memiliki urutan yang melekat di node, dan Anda ingin meratakan pohon kembali ke urutan aslinya, sebaiknya gunakan traversal berurutan . Pohon itu akan diratakan dengan cara yang sama seperti saat dibuat. Traversal pre-order atau post-order mungkin tidak melepaskan pohon kembali ke urutan yang digunakan untuk membuatnya.
Algoritma Rekursif untuk Pre-order, In-order dan 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
}