Scheme 树方案的最大值

Scheme 树方案的最大值,scheme,racket,Scheme,Racket,我想得到一棵树的最大值 我有这个: define (dato-tree nodo) (first nodo)) (define (left-tree nodo) (first (rest nodo))) (define (right-tree nodo) (first (rest (rest nodo)))) (define maximum (lambda (arbol) (if (eqv? (right-tree arbol) #f)

我想得到一棵树的最大值

我有这个:

define (dato-tree nodo)
(first nodo))

(define (left-tree nodo)
 (first (rest nodo)))

(define (right-tree nodo)
 (first (rest (rest nodo))))

(define maximum
    (lambda (arbol) 
        (if (eqv? (right-tree arbol) #f)
            arbol
            (maximum (right-tree arbol)))))
然后运行它:

(define tree (list 5 (list 2 (list 1 empty empty) empty) (list 7 empty empty)))

(maximum tree)
给我这个错误:

rest: expects a non-empty list; given: empty

怎么可能?

< p>如果前面的问题中提到的树是<强>排序的< /强>二叉树,则只需考虑正确的分支并找到最后一个节点的值:

(define (maximum arbol (m #f))
  (if (empty? arbol)
      m
      (maximum (right-tree arbol) (dato-tree arbol))))
然后

您甚至可以为空树指定要返回的值:

> (maximum empty)
#f
> (maximum empty 'empty)
'empty
> (maximum empty empty)
'()
否则我会选择:

(define (cons2 atom lst) 
  (if atom (cons atom lst) lst))

(define (maximum arbol)
  (if (empty? arbol)
      #f
      (apply max 
             (cons2 (maximum (left-tree arbol))
                    (cons2 (maximum (right-tree arbol))
                           (list (dato-tree arbol)))))))
其中
cons2
是仅当原子不是
#f
时才消耗原子的过程:

并且在过程
最大值
中非常方便,以防止测试子树的最大值是否为空:

> (maximum tree)
7
> (maximum empty)
#f

你是在用Racket医生的话吗?通常当出现错误时,它会突出显示代码中发生错误的位置。在本例中,很明显这是使用了
rest
,您可以在三个位置使用它。您应该能够跟踪程序的执行,并查看可以调用
(rest empty)
的位置。此外,您的过程中有一个检查
(eqv?(右树arbol)#f)
,但树中的任何位置都没有
#f
。你预计什么时候测试会成功?如果它从未成功,那么您将继续调用
(maximum(right tree arbol))
,但树不能永远运行下去。不难理解为什么你最终会调用
(rest empty)
,是吗?是的,我理解它在树的最大值时会是什么样子?我认为这是数据结构教科书或类可能会回答的问题。如果一棵树有三个部分(元素、左子树和右子树),那么如何定义整个树的最大元素呢?treeMax(tree(element,left,right))=max(element,treeMax(left),treeMax(right))@uselpa我相信这个问题是OP上一个问题的后续问题。如果在BST中是这种情况,则最大值是最右边的元素,不需要遍历整个树,而且可以编写一个树的
max-value
过程(即使未排序),而不需要中间列表。@ÓscarLópez您可能是对的,但是,我本以为这个重要的细节会出现在问题中。不管怎样,在我的回答中添加了这个,谢谢。
> (cons2 1 '(2))
'(1 2)
> (cons2 #f '(2))
'(2)
> (maximum tree)
7
> (maximum empty)
#f