Scheme中的树映射函数

时间:2013-10-17 16:23:59

标签: recursion map scheme binary-tree binary-search-tree

我在计划中编写了90%的树图函数,但是遇到了一个我遇到问题的主要问题。当我用二叉树测试我的代码时,除了第一个节点之外的所有节点都被正确映射。第一个节点退出了,我似乎无法想到解决这个问题的方法。这里有任何建议,我们将不胜感激。

(define (value tree)
 (car tree))

(define (left tree) 
  (car (cdr tree)))

(define (right tree)
 (car (cdr (cdr tree))))

(define (tree-map f T)
 (cond ((null? T) '())
     ((and (null? (right T))(null? (left T))) '())                                                              
     ((and (null? (right T))(not (null? (left T))))
                    (make-tree (f (value(left T)))
                               (tree-map f (left T))
                               (right T)))
     ((and (null? (left T))(not (null? (right T))))
                    (make-tree (f (value(right T)))
                               (left T)
                               (tree-map f (right T))
                               ))))

2 个答案:

答案 0 :(得分:2)

这段代码真是令人费解。首先,我没有看到else语句,并且看起来很大(如果两个分支都不是null tr​​ess)。第二个为什么你担心如果你已经有一个空树的情况,左边或右面是否为空?

(define (tree-map f T)
 (cond ((null? T) '())
       (else (make-tree (f (value T))
                        (tree-map f (left T))
                        (tree-map f (right T))))))

作为人类编译器并不好玩。所有你不喜欢你的叶子,空左和空右的情况都会重写相同的代码,但是在适当的情况下手动放入'(),而不是依靠函数来为你做。

答案 1 :(得分:1)

似乎有一些错误:

  • 如果找到了叶节点,则表示您没有将该功能应用于该节点
  • 节点缺少两个子树的情况
  • 应用功能的部分是错误的

尝试使用您的一个样本,问题不包括我自己测试的所有必要代码:

(define (tree-map f T)
         ; empty tree
  (cond ((null? T)
         '())
         ; leaf node
        ((and (null? (right T)) (null? (left T)))
         (make-tree (f (value T)) '() '()))
         ; empty right subtree
        ((and (null? (right T)) (not (null? (left T))))
         (make-tree (f (value T))
                    (tree-map f (left T))
                    '()))
         ; empty left subtree
        ((and (null? (left T)) (not (null? (right T))))
         (make-tree (f (value T))
                    '()
                    (tree-map f (right T))))
         ; both subtrees are present
        (else
         (make-tree (f (value T))
                    (tree-map f (left T))
                    (tree-map f (right T))))))