以下是SICP的练习2.65:
使用练习2.63和2.64的结果为实现为(平衡)二叉树的集合提供union-set和intersection-set的Θ(n)实现。
在“设置为有序列表”一章和练习2.62中,我们已经为有序列表设置了union-set和intersection-set。我在Internet上搜索过,2.65的答案太简单了,他们只是将二叉树转换成列表,仍然使用了有序列表的union-set和intersection-set。
在我看来,我们需要将集合转换为二叉树,并重写二叉树的union-set和intersection-set。
那么,我是否误解了SICP练习2.65的含义?还是有一个很好的答案?
答案 0 :(得分:3)
在这种情况下,“简单”答案是正确的:通过首先将树转换为列表(事实上,有序列表,因为我们正在对树进行顺序遍历)来解决练习,然后使用有序集程序,最后将结果集转换回树。为什么这是正确的?因为所描述的程序使用已有的程序实现了所需的O(n)
复杂性 - 无需重新发明轮子!
虽然可以通过操纵树来编写“直接”答案,但这太麻烦了,在O(n)
中实现而不使用变异操作会非常棘手(如果不是不可能!)到目前为止,我们尚未使用set!
,set-car!
或set-cdr!
。
答案 1 :(得分:2)
你是对的,你可以使用文本中的早期示例作为指导,为平衡二叉树编写union-set
和intersection-set
的有效实现。但是,该文本明确告诉您使用前两个练习的结果,因此它指导您找到特定的解决方案。该解决方案(将二进制树转换为列表以将问题减少到已经解决的问题)已经是O(n),无论如何这是您可以获得的最佳顺序。