【问题标题】:Work with binary search trees in Racket在 Racket 中使用二叉搜索树
【发布时间】:2018-04-25 06:10:54
【问题描述】:

我想在 Racket 中创建一个二叉搜索树。树的结构如下所示:

(define-struct tree-node (left right root))

现在我想在树中添加这些数字:

(define ex-list (list 1 4 6 2 7 8))

我的插入程序代码:

(define (insert-in-tree list tree) 
  (cond
    [(empty? tree) 
      (insert-in-tree (cons (second list) (rest (rest list))) 
                      (make-tree-node empty empty (first list)))]
    [(empty? list) 
      tree]
    [(> (first list) (tree-node-root tree)) 
      (insert-in-tree (cons (second list) (rest (rest list))) 
                      (make-tree-node 
                          (tree-node-left tree) 
                          (make-tree-node empty empty (first list)) 
                          (tree-node-root tree)))]
    [(< (first list) (tree-node-root tree)) 
      (insert-in-tree (cons (second list) (rest (rest list))) 
                      (make-tree-node 
                          (make-tree-node empty empty (first list)) 
                          (tree-node-right tree) 
                          (tree-node-root tree)))]
    [(= (first list) (tree-node-root tree)) 
      (insert-in-tree (cons (second list) (rest (rest list))) tree)]
    [else tree]))

我对代码的想法是什么:

  • 首先检查给定的树是否为空,如果是则将创建一个新的
  • 当列表中的第一个数字大于树的根时,它将在右侧添加,左侧较小
  • 相同的数字将被忽略

我的问题:当树只是 1 并且过程添加了 4 作为新的根元素添加到右侧。然后当我添加 6 时,它将替换 4,但它应该为 6 添加一个新节点。

我知道这个版本的代码不起作用,因为在列表只有一个元素的情况下,这个代码不起作用。

代码级别为中级学生

【问题讨论】:

    标签: tree scheme binary-search-tree racket racket-student-languages


    【解决方案1】:

    这个:

    (cons (second list) (rest (rest list))) 
    

    (rest list) 是一种很奇怪的写法,如果list 短于两个元素,也能保证出错。

    改变这一点,我们注意到它仍然会导致空列表错误;所以处理 this 可能性的子句必须移到顶部

    (define (insert-in-tree list tree)
      (cond
        [ (empty? list)
          tree ]
        [ (empty? tree)
          (insert-in-tree (rest list)
                          (make-tree-node empty empty (first list))) ]
        [ (> (first list) (tree-node-root tree))
          (insert-in-tree (rest list)
                          (make-tree-node
        ........
    

    至少现在它不会导致错误:

    > (insert-in-tree (list 1 2 3) empty)
    (make-tree-node '() (make-tree-node '() '() 3) 1)
    > (insert-in-tree (list 1 2 3 4 3 5) empty)
    (make-tree-node '() (make-tree-node '() '() 5) 1)
    > 
    

    但是从头到尾,你的方法都是错误的。您的代码混淆了两个本质上独立的问题:枚举列表元素和将元素插入树中。

    分开你的顾虑。每项任务都值得拥有自己的专用功能。以这种方式编写它可以让您轻松地将这两个任务结合起来,通过对列表枚举函数进行一些小改动,以利用插入函数。

    插入函数将实现比较逻辑,并利用... 插入函数,如果需要插入到一个分支中,因为分支树木,它们自己。

    【讨论】:

    • 感谢您的回答。这很有帮助!但是我不明白,如何防止更换分支?
    • 什么替换分支?为什么要阻止它?如果您插入一个分支,结果将(可能......)是一棵不同的树,不是吗,所以在更新的树中需要使用更新的分支而不是旧的分支。尝试编写此插入函数(one 元素到树中...可能为空,也可能不为空)。如果您遇到任何问题,请提出新问题。请具体说明,包括新代码和输出。
    • 那么,你的意思是如果分支中已经有这个元素,结果是一样的,如何防止替换?最好在第一次尝试时忽略这个细节。
    猜你喜欢
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    相关资源
    最近更新 更多