[英]Racket inorder(tree) returns list
我创建了这样的有序函数:
(define inorder
(λ (tree)
(unless(empty? (node-left tree)) (inorder(node-left tree)))
(print (node-x tree))
(unless(empty? (node-right tree)) (inorder(node-right tree)))
)
)
如何创建包含所有node-x树元素的列表,而不是打印它们。 我需要我的命令函数返回这些元素的列表。 我尝试使用辅助功能,但是没有用...
您需要想象一下(inorder (node-left tree))
和(inorder (node-right tree))
都返回一个列表。 您如何看待这些以及这一要素才能得出最终结果?
空树的结果将是一个空列表。 那应该是您的基本情况:
因此,您需要它看起来像这样:
(define (inorder tree)
(if (empty? tree)
'()
(append (inorder (node-left tree))
(list (node-x tree))
(inorder (node-right tree)))))
一个更好的版本,它不为每个级别使用append
,而是为每个元素将元素放置在正确的位置一次,如下所示:
(define (tree->list tree)
(let tree->list ((n tree) (acc '()))
(if (empty? n)
acc
(tree->list
(node-left n)
(cons (node-x n)
(tree->list (node-right n) acc))))))
起初较难理解,但在较大的树上性能更好。
第一步是让inorder
返回一个列表。 假设你想有一个平坦的列表,这意味着我们可以通过返回的列表inorder
左子树,当前节点,右子树,并追加以生产节点的平面列表的每个列表值从二叉树的最左边到右边。
(define inorder
(λ (tree)
(append (inorder(node-left tree))
(list (node-x tree))
(inorder(node-right tree)))))
请注意,我为当前节点创建了一个长度为1的列表,同时子树将返回列表。 这个骨架应该足以绕过递归如何解决这个问题。
现在,我们得到一棵空树的情况:如果我们有一棵空树,那么我们应该返回一个空列表,因为它没有要添加的元素。 使用if
很容易做到:
(define inorder
(λ (tree)
(if (empty? tree)
'()
(append (inorder(node-left tree))
(list (node-x tree))
(inorder(node-right tree))))))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.