如何合并红宝石中的两棵二叉树?

时间:2018-09-28 11:03:24

标签: ruby algorithm

我有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

3 个答案:

答案 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] #=> nili >= arr.sizenil.to_i #=> 0

对于不熟悉使用数组存储二叉树内容的读者(半小时前,包括我在内),我在下面提供了一张专业绘制的图片,其中显示了对应于三棵树的二叉树问题中给出的数组。

enter image description here

在每个数组中,索引为i的节点具有索引为2*i+1的左节点和索引为2*i+2的右节点。例如,在中间数组中,索引为02)的节点的左节点(1)位于索引为2*0+1 #=> 1的右节点({{1 }})位于索引3上。同样,索引为2*0+2 #=> 21)的节点在索引为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]