【问题标题】:LISP function that returns complete binary tree返回完整二叉树的 LISP 函数
【发布时间】:2020-11-10 20:31:24
【问题描述】:

我正在尝试做一个 lisp 函数,它将接收一个列表并返回一个完整的二叉树,其节点以相同的顺序从列表的元素中填充。
例如,
(makeTree '(4 3 9 10))
(4 (3 (9 () ()) ()) (10 () ()))

为此,我使用了一个将列表拆分为 2 的函数。所以,我所做的是尝试将列表的头部与尾部分开,然后使用拆分函数来执行二叉树.但我在实施它时遇到了麻烦。有人可以帮我吗?
到目前为止,这是我的代码:

(defun aux-head (l n)
   (if (= n 0) '()
       (cons (car l) (aux-head (cdr l)(- n 1)))))
(defun aux-tail (l n)
   (if (= n 0) l
       (aux-tail (cdr l) (- n 1))))
(defun split (lst)
   (cond
       ((null lst) '(()()))
       ((evenp (length lst))
          (list (aux-head lst (/ (length lst) 2))(aux-tail lst (/ (length lst) 2))))
       ((oddp (length lst))
          (list (aux-head lst (+ (floor (length lst) 2) 1))
                (aux-tail lst (+ (floor (length lst) 2) 1))))))
(defun make-cbtree (lst)
   (cond
       ((null lst) '(()()))
       ((car lst)
          ((split ((cdr lst)))))))

【问题讨论】:

  • 代码有什么问题?
  • 到目前为止代码没有错误,只是我需要帮助理解我必须如何做我的代码才能得到我需要的结果,这是一个完整的二叉树列表
  • 我知道我要做什么,只是我不知道该怎么做
  • 你怎么能通过输入说结果是(4 (3 (9 () ()) ()) (10 () ())),而不是(4 (3 (9 () ()) (10 () ())) ())?有什么特别的规则吗?因为否则任务是模棱两可的
  • 不是我说的。这是我们被要求做的。我添加了一张二叉树的图片,也许可以帮助

标签: lisp common-lisp


【解决方案1】:

创建二叉搜索树的常用方法是逐个添加项目。它可能看起来像这样:

(defun add-node (tree val)
  (if (null tree)
      (list val () ())
      (destructuring-bind (v l r) tree
        (if (< val v)
            (list v (add-node l val) r)
            (list v l (add-node r val))))))

这个将值插入到正确的位置(重建树,不可变样式):

CL-USER> (add-node (list 1 nil nil) 2)
;; (1 NIL (2 NIL NIL))
CL-USER> (add-node (list 1 nil nil) 0)
;; (1 (0 NIL NIL) NIL)

接下来你需要的是一个一个处理输入列表,将它添加到树中,从空的开始:

(defun make-tree (data)
  (reduce #'add-node data :initial-value nil))

CL-USER> (make-tree (list 4 3 9 10))
;; (4 (3 NIL NIL) (9 NIL (10 NIL NIL)))

你也可以组成traverse过程:

(defun traverse (tree)
  (when tree
    (append (traverse (cadr tree))
            (list (car tree))
            (traverse (caddr tree)))))

CL-USER> (traverse (make-tree (list 4 3 9 10)))
;; (3 4 9 10)

【讨论】:

  • 如果我使用我创建的拆分方法而不是解构绑定,我会得到相同的结果吗?
猜你喜欢
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
相关资源
最近更新 更多