返回完整二叉树的LISP函数 我正在尝试执行一个lisp函数,该函数将接收一个列表,并返回一个完整的二叉树,其节点按相同的顺序从列表的元素填充 例如 (makeTree '(4 3 9 10)) (4 (3 (9 () ()) ()) (10 () ()))
为此,我使用了一个将列表拆分为2的函数。因此,我所做的是尝试将列表的头部与尾部分开,然后使用split函数来实现二叉树。但我在实施上遇到了困难。有人能帮我吗?返回完整二叉树的LISP函数 我正在尝试执行一个lisp函数,该函数将接收一个列表,并返回一个完整的二叉树,其节点按相同的顺序从列表的元素填充 例如 (makeTree '(4 3 9 10)) (4 (3 (9 () ()) ()) (10 () ())),lisp,common-lisp,Lisp,Common Lisp,为此,我使用了一个将列表拆分为2的函数。因此,我所做的是尝试将列表的头部与尾部分开,然后使用split函数来实现二叉树。但我在实施上遇到了困难。有人能帮我吗? 以下是我目前的代码: (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
以下是我目前的代码:
(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)))))))
创建二叉搜索树的常用方法是逐个添加项。它可能是这样的:
(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))))))
接下来,您需要逐个处理输入列表,将其添加到树中,从空列表开始:
(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)))
您还可以执行遍历过程
步骤:
(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)
代码有什么问题?到目前为止,代码中没有错误,只是我需要帮助理解我必须如何编写代码才能得到我需要的结果,这是一个完整的列表二叉树。我知道我必须做什么,只是我不知道如何做。通过输入,你怎么能说结果是
(4(3(9())(10())
,而不是(4(3(9())(10()))
?是否有任何特殊的规则集?因为否则任务是含糊不清的。不是我说的。这是我们被要求做的。我添加了一个二叉树的图片,如果我使用我创建的拆分方法而不是分解绑定,可能会有所帮助,我会得到同样的结果吗?
(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)