Ön Sipariş, Siparişte ve Sipariş Sonrası Geçiş Stratejisi ne zaman kullanılır?
Bir ikili ağaç için hangi koşullar altında ön sipariş, sıra ve son sipariş kullanacağınızı anlamadan önce, her geçiş stratejisinin nasıl çalıştığını tam olarak anlamanız gerekir. Aşağıdaki ağacı örnek olarak kullanın.
Ağacın kökü 7 , en soldaki düğüm 0 , en sağdaki düğüm 10'dur .
Ön sipariş geçişi :
Özet: Kökte ( 7 ) başlar, en sağdaki düğümde biter ( 10 )
Geçiş sırası: 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10
Sıralı geçiş :
Özet: En soldaki düğümde ( 0 ) başlar, en sağdaki düğümde ( 10 ) biter
Geçiş Sırası: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Sipariş sonrası geçiş :
Özet: En soldaki düğüm ( 0 ) ile başlar, kök ( 7 ) ile biter
Geçiş sırası: 0, 2, 4, 6, 5, 3, 1, 8, 10, 9, 7
Ön Sipariş, Siparişte veya Sonradan Sipariş ne zaman kullanılır?
Programcının seçtiği geçiş stratejisi, tasarlanan algoritmanın özel ihtiyaçlarına bağlıdır. Hedef hızdır, bu nedenle size en hızlı şekilde ihtiyaç duyduğunuz düğümleri getiren stratejiyi seçin.
Herhangi bir yaprağı incelemeden önce kökleri keşfetmeniz gerektiğini biliyorsanız, ön sipariş verirsiniz çünkü tüm yapraklardan önce tüm köklerle karşılaşacaksınız.
Herhangi bir düğümden önce tüm yaprakları keşfetmeniz gerektiğini biliyorsanız, son siparişi seçersiniz çünkü yaprakları aramak için kökleri incelemekle zaman kaybetmezsiniz.
Eğer ağaç düğümlerde doğal bir diziyi olduğunu biliyoruz ve bir daha özgün dizisi içine ağaç geri, düzleştirmek istiyorsanız de sipariş kastetmek kullanılmalıdır. Ağaç, yaratıldığı şekilde düzleştirilecekti. Ön sipariş veya sipariş sonrası geçiş, ağacı, onu oluşturmak için kullanılan sıraya geri döndürmeyebilir.
Ön Sipariş, Sırayla ve Sipariş Sonrası için Özyineli Algoritmalar (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
}