二叉树(+;,-,*,/)中的Scheme/Racket操作

二叉树(+;,-,*,/)中的Scheme/Racket操作,scheme,racket,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) nu

如何生成一个操作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)

注意:表示法是
(父亲(左儿子)(右儿子))

关于你的问题有一些可疑之处:

  • 操作
    +
    不应是字符串
  • 在表示列表的方式中,null实际上是null符号,而不是空列表
  • 您的元素不一致地表示为(父子左父子右父子)
  • 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)