Сначала вы должны найти позиции, вы можете сделать это путем подсчета числа левых и права тратить на конкретный узел:
1 : l = 0, r = 0
/\
/ \
l=1,r=0 2 3 : l = 0, r = 1.
/\ /\
... 4...5 6...7 ....
Просто вы можете пройти ваш бинарное дерево и, наконец, вычислить LorR = NumberOfLeft - NumberOfRights
для каждого узла, то группа эти цифры (по их стоимости LorR
) вместе и найти каждую сумму групп (распечатать их из самых положительных до самых отрицательного значения LorR
) ,
Обновление: Это не отвечает за дерево с высотой более двух, мы можем исправить эту проблему с небольшими изменениями в алгоритме.
Мы можем видеть дерево, как пирамиды, каждая вершина пирамиды имеет длину 1, после того, как каждая ветвь оставшаяся часть ветви равно, что прошло в последнем движении, мы покажем это на картинке для дерева высоты 3:
1
/\
/ \
/ \
2 3 upto this we used 1/2 size of pyramid
/\ /\
/ \ / \
4 5 6 7 upto this we used 1/2 + 1/4 part of pyramid
/\/\/\/\
5 9 1 3 6 7 5 5 upto this we used 1/2 + 1/4 + 1/4 part of pyramid
Это означает, что на каждом шаге мы вычисляем левые значения по их высоте (фактически каждый раз умножая 1/2 будет добавлен к левому значению, за исключением последнего времени, равного h-1-й значению).
Итак, для этого случая мы имеем: 1 в корне в группе 0, 3 в листе в группе -1/2 + 1/4 + 1/4 = 0, 6 в листе находится в группе 1/2 - 1/4 - 1/4 = 0
1 в листе находится в -1/2 + 1/4 - 1/4 = -1/2 и так далее.
Для предотвращения округления 1/(2^x) до нуля или других проблем мы можем умножить наши коэффициенты (1/2, 1/4, 1/8, ...) на 2 h-1 , Фактически в первом случае я написал, что коэффициенты умножаются на 2 2-1.
Как вы рассчитываете сумму? как его вертикаль? –
Я отредактировал вопрос. Найдите вертикальные линии. –
Мне непонятно, как определяются вертикальные линии. Не могли бы вы показать его для дерева с еще одним уровнем? – svick