二叉树中的方案/球拍操作(+, - ,*,/)

时间:2014-11-21 20:06:20

标签: scheme racket

如何创建一个运行2个二叉树的函数?例如,如果操作是“+”,则结果树的每个节点的n-esim数将是第一棵树的n-esim数与第二棵树的n-esim数之和,考虑相同每个节点的结构(如果节点是列表,则总和将是列表,如果节点是数字,则结果将是数字等)。

以下是一个例子:

(operate "+" ’((1 2)((2 3) null null) null) ’((0 2)((1 4) null null) null))

回报应该是:

’((1 4) ((1 7) null null) null)

注意:表示为(Father (leftSon)(rightSon))

1 个答案:

答案 0 :(得分:1)

关于你的问题,有一些可疑的事情:

  • 操作+不应该是字符串
  • 表达列表的方式, null 实际上是符号 null而不是空列表
  • 您的元素不一致表示为(父亲leftSon rightSon)
  • 2 + 3是5,所以你给出的结果似乎不正确

但假设这真的是你想要的,这是一个简单的列表遍历:

(define (operate fun sxp1 sxp2)
  (cond
    ((null? sxp1) sxp1)     ; the real empty list
    ((eq? 'null sxp1) sxp1) ; the symbol null
    ((pair? sxp1) (cons (operate fun (car sxp1) (car sxp2))
                        (operate fun (cdr sxp1) (cdr sxp2))))
    (else (fun sxp1 sxp2)))) ; atom => apply fun to elements

测试:

> (operate + '((1 2) ((2 3) null null) null) '((0 2) ((1 4) null null) null))
'((1 4) ((3 7) null null) null)