Учитывая двоичное дерево, выведите его вертикально. В следующем примере показан обход вертикального порядка.
1
/ \
2 3
/ \ / \
4 5 6 7
\ \
8 9
The output of print this tree vertically will be:
4
2
1 5 6
3 8
7
9
Идея состоит в том, чтобы пройти дерево один раз и получить минимальное и максимальное горизонтальное расстояние относительно корня. Для дерева, показанного выше, минимальное расстояние равно -2 (для узла со значением 4), а максимальное расстояние равно 3 (для узла со значением 9). Получив максимальное и минимальное расстояния от корня, мы выполняем итерацию для каждой вертикальной линии на расстоянии от минимума до максимума от корня, а также для каждой вертикальной линии пересекаем дерево и выводим узлы, которые лежат на этой вертикальной линии.
Алгоритм:
// min --> Minimum horizontal distance from root
// max --> Maximum horizontal distance from root
// hd --> Horizontal distance of current node from root
findMinMax(tree, min, max, hd)
if tree is NULL then return;
if hd is less than min then
min = hd;
else if hd is greater than max then
*max = hd;
findMinMax(tree->left, min, max, hd-1);
findMinMax(tree->right, min, max, hd+1);
printVerticalLine(tree, line_no, hd)
if tree is NULL then return;
if hd is equal to line_no, then
print(tree->data);
printVerticalLine(tree->left, line_no, hd-1);
printVerticalLine(tree->right, line_no, hd+1);
Реализация: Ниже приведена реализация вышеуказанного алгоритма.
C ++
#include <iostream>
usingnamespacestd;
// узел двоичного дерева
structNode
{
intdata;
structNode *left, *right;
};
// Вспомогательная функция для создания нового узла двоичного дерева
Node* newNode(intdata)
{
Node *temp = newNode;
temp->data = data;
temp->left = temp->right = NULL;
returntemp;
}
// Полезная функция для нахождения минимального и максимального расстояния по отношению // для root.
Console.WriteLine("vertical order traversal is :");
tree.verticalOrder(tree.root);
}
}
/ * Этот код предоставлен PrinciRaj1992 * /
Выход:
Vertical order traversal is
4
2
1 5 6
3 8
7
9
Сложность времени: временная сложность вышеописанного алгоритма составляет O (w * n), где w — ширина двоичного дерева, а n — количество узлов в двоичном дереве. В худшем случае значение w может быть O (n) (рассмотрим, например, полное дерево), а сложность по времени может стать O (n 2 ).
Эту проблему можно решить более эффективно, используя методику, рассмотренную в этом посте. Вскоре мы обсудим полный алгоритм и реализацию более эффективного метода.
Эта статья предоставлена Шалки Агарвал . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме