Вопрос заключается в том, чтобы узнать сумму расстояний между каждыми двумя узлами BinarySearchTree, учитывая, что каждая пара родитель-ребенок разделяется единичным расстоянием. Он должен быть рассчитан после каждой вставки.
Пример:
->first node is inserted..
(root)
total sum=0;
->left and right node are inserted
(root)
/ \
(left) (right)
total sum = distance(root,left)+distance(root,right)+distance(left,right);
= 1 + 1 + 2
= 4
and so on.....
Решения, с которыми я столкнулся:
-
перебор. Шаги:
- выполнить DFS и отслеживать все узлы:
O(n)
. - Выберите каждый из двух узлов и вычислите:
O(nC2)_times_O(log(n))=O(n2log(n))
расстояние между ними, используя Самый низкий общий предок и добавьте их.
Общая сложность:
-O(n2log(n))
. - выполнить DFS и отслеживать все узлы:
-
O(nlog(n))
. Шаги: -- Перед вставкой выполните DFS и отслеживайте все узлы:
O(n)
. - Рассчитайте расстояние между вставленными node и:
O(nlog(n))
. остальные узлы. - Добавьте существующую сумму с суммой, вычисленной на шаге 2
Общая сложность:
-O(nlog(n))
. - Перед вставкой выполните DFS и отслеживайте все узлы:
Теперь возникает вопрос: существует ли какое-либо решение порядка O(n)
??