【问题标题】:maximum value of a tree scheme树方案的最大值
【发布时间】:2014-06-02 14:03:07
【问题描述】:

我想得到一棵树的最大值

我有这个:

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

怎么可能?

【问题讨论】:

  • 你在 Dr.Racket 中运行这个吗?通常当出现错误时,它会在代码中突出显示错误发生的位置。在这种情况下,很明显它使用了rest,你在三个地方都有。您应该能够跟踪程序的执行并查看可以调用(rest empty) 的位置。
  • 另外,您的程序中有一个检查 (eqv? (right-tree arbol) #f),但您的树中没有 #f。您预计该测试何时会成功?如果它永远不会成功,那么你继续调用(maximum (right-tree arbol)),但树不能永远继续下去。不难看出你为什么最终会打电话给(rest empty),是吗?
  • 是的,我明白树的最大值会怎样?
  • 我认为数据结构教科书或课程可能会回答这类问题。不用担心它的实现方面,如果一棵树包含三个部分(元素、左子树和右子树),那么如何定义整个树的最大元素? treeMax(tree(element,left,right)) = max(element,treeMax(left),treeMax(right)).

标签: scheme racket


【解决方案1】:

如果树是您上一个问题中建议的排序二叉树,您只需要考虑正确的分支并找到最后一个节点的值:

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

然后

> (maximum tree)
7

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

> (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 时才对原子进行约束的过程:

> (cons2 1 '(2))
'(1 2)
> (cons2 #f '(2))
'(2)

并且在过程maximum中派上用场,以防止测试子树的最大值是否为empty

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

【讨论】:

  • @uselpa 我相信这个问题是 OP 上一个问题的后续问题。如果在 BST 中是这种情况,最大值是最右边的元素,则无需遍历整个树,并且可以编写不需要中间列表的树(甚至未排序)的 max-value 过程。
  • @ÓscarLópez 你可能是对的,但我本来希望这个重要的细节会出现在问题中。无论如何,将此添加到我的答案中,谢谢。
猜你喜欢
  • 2018-10-05
  • 2018-03-20
  • 2012-11-28
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多