bst中的所有小于x的值(方案)

时间:2015-11-16 01:04:38

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

有人说这个问题是重复的。我查看了另一个问题,它是一种与方案不同的编程语言。

我正在尝试编写一个函数(小于x树),它将显示小于或等于x的树中的所有节点。

我有一个旧代码返回树的最小值,但我不知道如何返回值列表?这看起来只在树的左边。如何在两个子树(左侧和右侧)中查看?

(define (bst-smallest bs-tree)
  (cond ((null? bs-tree)
     '())
    ((null? (bst-left bs-tree))
     (bst-value bs-tree))
    (else
     (bst-smallest (bst-left bs-tree)))))

2 个答案:

答案 0 :(得分:2)

一个简单的解决方案是迭代树(我将使用in-order traversal保留顺序)并在列表中累积恰好小于或等于给定值的所有元素。请注意,第二个条件利用树的顺序来避免遍历树上必须大于我们正在寻找的元素:

(define (bst-lte bs-tree value)
  (cond ((null? bs-tree)                     ; if tree is empty
         '())                                ; return empty list
        ((> (bst-value bs-tree) value)       ; if current element > value
         (bst-lte (bst-left bs-tree) value)) ; go to the left
        (else                                ; else advance recursion
         (append                             ; `append` the result
          (bst-lte (bst-left bs-tree) value) ; traverse the left subtree
          (list (bst-value bs-tree))         ; add it to the answer
          (bst-lte (bst-right bs-tree) value))))) ; traverse the right subtree

答案 1 :(得分:2)

您不想直接返回值列表。首先构建一个树会更有意义。

考虑你的基本情况。调用输入树iTree和目标值x

  1. iTree为空 - 返回空树。

  2. iTree节点大于左侧树上的x - recur

  3. 否则用iTree的节点构建一棵树,左边是iTree的左边树,右边的树是iTree右边树上的递归。

     (define (lessthan x tree)
          (define (helper itree)
            (cond ((empty? itree) empty-tree)
                  ((> (node itree) x) (helper (left-tree itree)))
                  (else (make-tree (node itree) 
                                   (left-tree itree) 
                                   (helper (right-tree itree))))))
                  (tree->list (helper tree)))
    
  4. 这不是有效的代码,但应该很容易适应您的实现。