Когда следует использовать стратегию предзаказа, порядка и пост-порядка обхода
Прежде чем вы сможете понять, при каких обстоятельствах использовать предзаказ, порядок и пост-порядок для двоичного дереваВы должны точно понимать, как работает каждая стратегия обхода.Используйте следующее дерево в качестве примера.
Корень дерева - 7 , самый левый узел - 0 , самый правый узел - 10 .
Предварительный заказ :
Краткое описание: начинается с корня ( 7 ), заканчивается у правого краяузел ( 10 )
Последовательность обхода: 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10
Inпорядок обхода :
Сводка: начинается в крайнем левом узле ( 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
Когда использовать Предзаказ, Заказ или Пост-заказ?
Стратегия обхода, которую выбирает программист, зависит от конкретных потребностейалгоритм разрабатывается.Цель - скорость, поэтому выберите стратегию, которая обеспечит вам самые быстрые узлы.
Если вы знаете, что вам нужно изучить корни, прежде чем осматривать листья, выберите Предварительный заказ потому что вы встретите все корни раньше, чем все листья.
Если вы знаете, что вам нужно исследовать все листья перед любыми узлами, вы выбираете post-order , потому что вы не тратите время на поиск корней в поискеуходит.
Если вы знаете, что у дерева есть внутренняя последовательность в узлах, и вы хотите сгладить дерево обратно в исходную последовательность, чем по порядку *Следует использовать 1071 * обход.Дерево будет сплющено так же, как оно было создано.Обход при предварительном заказе или после заказа может не развернуть дерево обратно в последовательность, которая использовалась для его создания.
Рекурсивные алгоритмы для предварительного заказа, заказа и пост-заказазаказ (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
}