将节点插入树 - 球拍

时间:2016-11-10 04:09:42

标签: functional-programming lisp racket typed-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))))

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

1 个答案:

答案 0 :(得分:0)

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

在空树中插入会创建一个包含一个节点的树。

插入非空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)))