我想通过 lisp 中的树并通过使用列表形式的树找到最深(或离根节点最远)。到目前为止,我的想法是继续将树切割成左右子树(假设父节点只会像二叉树一样有两个儿子)我将在下面发布我的代码,因为虽然它编译它给了我nil 的错误不是真正的类型。任何建议都会很好,甚至可以改进代码!
我在查找节点之间的路径方面看到了类似的问题,但还没有真正看到有关如何将最深节点实际打印到屏幕上的任何有用信息。
感谢您的关注。
(defun postorder(tree)
(cond ((null tree) 0)
((< (list-length tree) 3) 0)
(t
(append (postorder (left-subtree tree))
(postorder (right-subtree tree))
(list (car tree))))))
(defun tree-depth (sub-tree)
(cond ((null sub-tree) nil)
((atom sub-tree) nil)
(t (+ 1 (max (tree-depth (cadr sub-tree)) (tree-depth (caddr sub-tree)))))))
(defun left-subtree(tree)
(cond ((null tree) nil)
((not (listp tree)) nil)
(t (car (cdr tree)))))
(defun right-subtree(tree)
(cond ((null tree) nil)
((not (listp tree)) nil)
(t (car (cdr (cdr tree))))))
(defun split-tree (tree)
(cond ((null tree)
tree)
((> (tree-depth (left-subtree tree)) (tree-depth (right-subtree tree)))
(split-tree (left-subtree tree)))
((< (tree-depth (left-subtree tree)) (tree-depth (right-subtree tree)))
(split-tree (right-subtree tree)))
((= (tree-depth (left-subtree tree)) (tree-depth (right-subtree tree)))
(first (postorder tree)))))
输入将类似于 '(1 (2 (4) (6)) (5 (7) (8))))