【问题标题】:Insert Node into a Tree - Racket将节点插入树 - 球拍
【发布时间】:2017-03-24 00:31:55
【问题描述】:

我正在尝试向树中添加一个新节点。以下是我的定义和函数类型:

(define-struct (Some T)
  ([value : T]))

(define-type (Option T)
  (U 'None (Some T)))

(define-type BST (U 'E Nd))

(define-struct Nd
  ([root : Integer]
   [lsub : BST]
   [rsub : BST]))

(: insert : Integer BST -> BST)
;; insert an item into a tree
;; note: do not insert duplicate items
(define (insert n x)
  (match x
    ('E 'E)
    ((Nd ro ls rs)
     (cond
       ((= (size x) 1) (Nd ro (Nd n 'E 'E) 'E))
       (else
        (Nd ro ls rs))))))

Insert 是将节点插入树的插入。

以下是我将给出的命令:

(insert 10 (Nd 1 (Nd 2 (Nd 4 'E 'E) (Nd 5 'E 'E)) (Nd 3 (Nd 6 'E 'E) (Nd 7 'E 'E))))

它应该在树中插入十个。但是,我在家里独立学习,我不知道该怎么做。请帮忙。非常感谢!

【问题讨论】:

  • 如果你错过了,有两本好书可以免费在线获得:SICPHtDP。它们与 Typed Racket 无关,但原理是相同的。

标签: functional-programming lisp racket typed-racket


【解决方案1】:

你错过了递归,你的基本情况是错误的。

插入一棵空树会创建一棵只有一个节点的树。

插入一个非空的 BST 有三种情况:

  • 如果该项与该节点中的项相同,则返回树原样
  • 如果项小于该节点,则插入左子树
  • 否则,插入右子树

类似

(define (insert n x)
  (match x
    ('E (Nd n 'E 'E))
    ((Nd ro ls rs)
     (cond
      ((= n ro) x)
      ((< n ro) (Nd ro (insert n ls) rs))
      (else     (Nd ro ls (insert n rs)))))))

您要插入的树不是 BST,所以这行不通。

您的树具有以下结构:

   1
  /\
 2  3
 /\ /\
4 5 6 7

包含这些元素的搜索树如下所示:

   4
  /\
 2  6
 /\ /\
1 3 5 7

这是

(Nd 4 (Nd 2 (Nd 1 'E 'E) (Nd 3 'E 'E)) (Nd 6 (Nd 5 'E 'E) (Nd 7 'E 'E)))

【讨论】:

    猜你喜欢
    • 2021-08-03
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    相关资源
    最近更新 更多