Получил эту проблему в одном из конкурсов кодирования. У тебя есть лучший подход, чем у меня. Я дал псевдокод ниже
Учитывая полное двоичное дерево с узлами значений 1 или 0, всегда выполняются следующие правила:
- значение узла равно 1, если и только если значения всех его узлов поддерева 1
- конечный узел может иметь значение 1 или 0
Реализуйте следующие 2 API:
set_bit(offset, length)
, установите биты в диапазоне от offset
до offset+length-1
на конечных узлах clear_bit(offset, length)
, очистите биты в диапазоне от offset
до offset+length-1
на конечных узлах
т.е. дерево имеет вид:
0
/ \
0 1
/ \ / \
0 1 1 1
/\ / \ / \ / \
0 1 1 1 1 1 1 1
Ввод будет дан в виде двумерного массива
int arr[][] = [ [0],[0,1],[1,0,1,0],[1,1,1,0,1,1,1,1]]
нам нужно установить бит или очистить бит на листовых узлах , В приведенном выше примере, если я делаю
clear(3,5)
i.e. The tree would be like:
0
/ \
0 0
/ \ / \
0 0 0 0
/\ / \ / \ / \
0 1 1 0 0 0 0 0
Псевдокод: Мой подход
1] Go к последней строке и внутреннему l oop начинается со смещения на листовом узле (последняя строка + смещение).
2] проверяет наличие элемента со смещением, если оно равно 1
3], если родственный ноль, то предок равен нулю не дальше action else, если это один
4], запишите диапазон предка до нуля в нашем случае (предок - строка- и столбец / 2), так в нашем случае для строки 2 (диапазон - от столбца 1 до 3)
5] следующая строка итерации 2 и внутренний l oop переместится из столбца 1 в 3
6], продолжая повторять
Для заданного бита мы также может за аналогичный подход