tree1 = [1, 3, 2, 5]
tree2 = [2, 1, 3, nil, 4, nil, 7]
[tree1.size, tree2.size].max.times.map { |i|
tree1[i].nil? && tree2[i].nil? ? nil : tree1[i].to_i + tree2[i].to_i }
#=> [3, 4, 5, 5, 4, nil, 7]
Обратите внимание, что arr[i] #=> nil
, если i >= arr.size
и nil.to_i #=> 0
.
Для читателей, незнакомых с использованием массива для хранения содержимого двоичного дерева (что составляет полчаса).назад, включая меня) Ниже я привел профессионально нарисованную картинку, которая показывает двоичные деревья, соответствующие трем массивам, приведенным в вопросе.
В каждом массиве узел с индексом i
имеет левый узел с индексом 2*i+1
и правый узел с индексом 2*i+2
.Например, в среднем массиве узел с индексом 0
(2
) имеет свой левый узел (1
) с индексом 2*0+1 #=> 1
и правый узел (3
) с индексом 2*0+2 #=> 2
.Аналогично, узел с индексом 1
(1
) имеет правый узел (4
) с индексом 2*1+2 #=> 3
, но не имеет левого узла, поскольку элемент с индексом 2*1+1 #=> 3
равен nil
.
* 1030.* Правило объединения двух двоичных деревьев: «Если два узла перекрываются (то есть узлы находятся на одной и той же позиции на обоих графиках), то суммируйте значения узлов как новое значение объединенного узла; в противном случае это узел, который являетсяподарок (не
nil
в связанном массиве) будет использоваться в качестве узла нового дерева. "
1 Например, в объединенном дереве правый узел
3
5
равен
2
(из первого дерева) плюс
3
(из второго дерева), тогда как узел
7
взят из второго дерева, потому что у первого нет узла в этой позиции.
1,См. эту статью , в которой также обсуждаются алгоритмы объединения двоичных деревьев.