我有2个二叉树[1,3,2,5]和[2,1,3,null,4,null,7],我需要使用ruby编程语言将它们合并为单个树。 所以输出应该是[3,4,5,5,4,null,7]
我试图以预定的方式遍历两个给定的树。
我在做什么错了?
我尝试使用递归:
def merge_trees(t1, t2)
return if t1 == nil
return if t2 == nil
t1.val += t2.val
t1.left = merge_trees(t1.left, t2.left);
t1.right = merge_trees(t1.right, t2.right);
end
答案 0 :(得分:1)
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
的右节点({{1 }})位于索引3
上。同样,索引为2*0+2 #=> 2
(1
)的节点在索引为1
的右节点(4
),但是没有左节点,因为索引为2*1+2 #=> 3
的元素是2*1+1 #=> 3
。
合并两个二叉树的规则是:“如果两个节点重叠(即,节点在两个图中的相同位置),则将节点值加起来作为合并节点的新值;否则,节点存在的(不在关联数组中的nil
)将用作新树的节点。“ 1 例如,在合并树中,节点nil
的右节点3
等于5
(来自第一棵树)加上2
(来自第二棵树),而节点3
则来自第二棵树,因为第一棵没有节点处于该位置。
1。参见this article,其中还讨论了合并二叉树的算法。
答案 1 :(得分:0)
a = [1,3,2,5]
b = [2,1,3,nil,4,nil,7]
small,big = [a,b].minmax
big.each_with_index.inject([]) do |merged, (el, idx)|
merged << [el, small[idx]].instance_eval { compact.sum if any? }
end
#=> [3, 4, 5, 5, 4, nil, 7]
答案 2 :(得分:0)
喜欢吗?
[[1,3,2,5], [2,1,3,nil,4,nil,7]].
sort_by(&:size).
rotate.
reduce(&:zip).
map { |elems| elems.compact.reduce(&:+) }
#⇒ [3, 4, 5, 5, 4, nil, 7]