ruby - 如何在 ruby 中合并两个二叉树?
问题描述
我有 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
解决方案
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
。
对于不熟悉使用数组存储二叉树内容的读者(半小时前,包括我在内),我在下面提供了一张专业绘制的图片,该图片显示了与给出的三个数组对应的二叉树这个问题。
在每个数组中, index 处的节点在 index 处i
有一个左节点,在 index处有2*i+1
一个右节点2*i+2
。例如,在中间数组中,位于 index 0
( 2
) 处的节点的左节点 ( 1
) 位于 index 处2*0+1 #=> 1
,其右节点 ( 3
) 位于 index 处2*0+2 #=> 2
。类似地,index() 处的节点在 index 处1
有1
一个右节点 ( 4
) 2*1+2 #=> 3
,但没有左节点,因为 index 处的元素2*1+1 #=> 3
是nil
。
合并两棵二叉树的规则是:“如果两个节点重叠(即节点在两个图中的位置相同),则将节点值相加作为合并节点的新值;否则,存在的节点(不在nil
关联数组中)将用作新树的节点。” 1例如,在合并树中, node3
的右节点5
等于2
(来自第一棵树)加上3
(来自第二棵树),而 node7
取自第二棵树,因为第一棵树在该位置没有节点。
1. 见这篇文章,它还讨论了合并二叉树的算法。
推荐阅读
- rest - 什么是 HP-ALM 用于获取缺陷历史数据的 REST API
- android - 可以将现有的 apk 版本迁移到 App Bundle 格式吗?
- c# - GridView ComboBox - 绑定选定的元素属性
- arrays - 在实现堆栈和队列时,数组相对于链表的优势是什么
- sql-server - 使用 sqlpackage.exe 自定义 SQL Server Data Tools (SSDT) 包的部署,以因环境而异
- python - stats.nba.com 的 Python urllib 请求和 urlopen 超时
- angular - Angular路由器在重定向之前加载组件?
- java - 如何在 RxJava 中使用 HttpURLConnection?
- google-api - 即使在服务器到服务器身份验证之后也无法使用 Google Play Developer API
- javascript - 将 Ajax 数组插入日期范围选择器