将节点插入树中 - Racket

Insert Node into a Tree - Racket

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

(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))))

它应该将 10 插入到树中。然而,我在家自学,我不知道该做什么。请帮忙。非常感谢!

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

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

在非空BST中插入三种情况:

  • 如果项目与该节点中的项目相同,return树不变
  • 如果item小于该节点,则插入左子树
  • 否则,插入右子树

类似

(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)))