Tree 球拍:将节点插入到树中

Tree 球拍:将节点插入到树中,tree,racket,Tree,Racket,我想在球拍上建一棵树。 目前,我已经构建了一个“静态”树,用于测试insert方法。它沿着树向下运行到正确的位置,但无法插入新节点 这是一棵树: (define bst (make-node 4 (make-node 2 empty (make-node 3 empty empty)) (make-node 5 empty (make-node

我想在球拍上建一棵树。 目前,我已经构建了一个“静态”树,用于测试insert方法。它沿着树向下运行到正确的位置,但无法插入新节点

这是一棵树:

(define bst
  (make-node 4
             (make-node 2 empty 
                        (make-node 3 empty empty))
             (make-node 5 empty
                        (make-node 11 empty 
                                   (make-node 12 empty
                                   (make-node 13 empty empty))))))
insert方法(我留下了所有调试打印,因此很容易看到发生了什么,并且树是正确的):

将树打印为列表:

(define (tree->list tree)
  (if (empty? tree)
      empty
      (append (tree->list (node-right tree))
              (cons (node-val tree)
                    (tree->list (node-left tree))))))


(printf "\n\nPrinting tree as list: \n")
(tree->list bst)
输出:

Printing tree as list: 
'(13 12 11 5 4 3 2)

“17”没有出现。我无法将新节点分配到当前节点的左/右字段(ABB指向它)。这里的问题是什么?

如果我正确理解了您的代码,
insert
应该从头开始重建树,保留绑定到
bst
的原始树不变。
(树->列表(插入bst 17))
显示了什么?是的,没错,我是从头开始构建的。但我想改变原来的树,因为某种原因,它似乎失败了。我将该操作的输出添加到帖子中。您不会使用“功能性”方法来“更改原始内容”,而保持原始内容不变。您可以通过
(定义bst(插入bst 17))
更新
bst
的绑定以使用新的树,但错误消息显示:
module:duplicate definition for identifier in:bst
啊。。。很抱歉。球拍不允许在顶级重新定义。关键是:在“真正的程序”中你不需要它。
(define (tree->list tree)
  (if (empty? tree)
      empty
      (append (tree->list (node-right tree))
              (cons (node-val tree)
                    (tree->list (node-left tree))))))


(printf "\n\nPrinting tree as list: \n")
(tree->list bst)
Printing tree as list: 
'(13 12 11 5 4 3 2)