Коли використовувати стратегію попереднього замовлення, замовлення та замовлення після замовлення
Перш ніж ви зможете зрозуміти, за яких обставин використовувати попереднє замовлення, порядок і після замовлення для двійкового дерева, ви повинні зрозуміти, як саме працює кожна стратегія обходу. Для прикладу використайте наступне дерево.
Корінь дерева - 7 , самий лівий вузол - 0 , самий правий вузол - 10 .
Обхід попереднього замовлення :
Короткий зміст: Починається в корені ( 7 ), закінчується в самому правому вузлі ( 10 )
Послідовність обходу: 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10
Обхід в порядку :
Короткий зміст: Починається в самому лівому вузлі ( 0 ), закінчується в самому правому вузлі ( 10 )
Послідовність обходу: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Обхід після замовлення :
Короткий зміст: Починається з самого лівого вузла ( 0 ), закінчується коренем ( 7 )
Послідовність обходу: 0, 2, 4, 6, 5, 3, 1, 8, 10, 9, 7
Коли використовувати попереднє замовлення, замовлення чи замовлення?
Стратегія обходу, яку вибирає програміст, залежить від конкретних потреб розробленого алгоритму. Мета - швидкість, тому вибирайте стратегію, яка найшвидше приносить вам потрібні вам вузли.
Якщо ви знаєте, що вам потрібно дослідити коріння перед тим, як перевіряти будь-яке листя, вибирайте попереднє замовлення, оскільки ви зустрінете всі коріння перед усіма листям.
Якщо ви знаєте, що вам потрібно вивчити всі листки перед будь-якими вузлами, ви вибираєте пост-замовлення, оскільки не витрачаєте часу, перевіряючи коріння на пошук листя.
Якщо ви знаєте, що дерево має невід'ємну послідовність у вузлах, і ви хочете згладити дерево назад у початкову послідовність, слід використовувати обхід в порядку . Дерево було б сплющено так само, як воно було створено. Обхід попереднього замовлення або після замовлення може не розмотати дерево назад у послідовності, яка була використана для його створення.
Рекурсивні алгоритми для попереднього замовлення, замовлення та після замовлення (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
}