Использование двоичного дерева для добавления к N путем добавления 1 или удвоения - PullRequest
0 голосов
/ 25 февраля 2020

Мне поручено закодировать решение следующей проблемы:

Учитывая целое число X и целое число Y, где X - конечная сумма, а Y - количество раз, которое мне разрешено удваивать мой текущий сумма в моей цепочке добавления чисел. Мы начинаем с 1 и добавляем к нашей сумме либо

1) добавляя 1 к нашей текущей сумме, либо

2) удваивая нашу текущую сумму.

Функция должна возвращать наименьшее количество раз, которое мы добавляем к нашей сумме, чтобы достичь X.

Например,

, если X = 10 и Y = 2, самый короткий способ прибавить к 10 будет:

1,2,4,5,10 = 4 шага сложения с 2 шагами удвоения (из 2-> 4 и 5-> 10, 1-> 2 не считается как удвоение)

Я ломал голову над решением, и я рассматриваю возможность реализации подхода бинарного дерева к этой проблеме. Головным узлом будет 2, поскольку мы всегда добавляем от 1 до 2. Левый узел добавляет 1, а правый узел удваивается. Это будет выглядеть примерно так:

            2
      3          4
   4   6      5    8
 5 8 7 12   6 10  9 16

И как только оно достигнет 10, оно прекратится и ответ будет num_of_traversals + 1. Конечно, он должен был бы проверить, что число раз, когда он выбрал правильный узел, было меньше или равно K. Если больше K, то он продолжает проходить до следующего вхождения 10.

Я никогда ранее кодировался с двоичными деревьями, поэтому я не уверен, как бы я go реализовал этот псевдокод. Я заинтересован в некоторой помощи для начала работы с этой проблемой. Спасибо!

Редактировать: Я решил эту проблему с помощью недвоичного дерева. Но мне все еще очень любопытно, как можно было бы сделать это с помощью бинарного дерева или если это даже желательно.

...