我正在尝试使用RACKET / DR为二叉树编写用于顺序遍历的算法。 RACKET
(define (print-records node number)
(cond
[(not (empty? node-left))(print-records (node-left node) number )]
*Do This before moving to next IF clause*
[(not (empty? node-right))(print-records(node-right node) number)]
))
我正在尝试遵循以下算法
InOrder(node)
if node is null return
InOrder(node.left)
Print(node)
InOrder(node.Right)
我的问题是通过COND我可以执行一个表达式,它将跳过其余的表达式。我试图在一个不起作用的情况下添加两个表达式,例如((a)(b))。我也试图做一个帮助程序,但这也不起作用。
答案 0 :(得分:2)
您以错误的方式使用cond
。请注意,您必须以递归方式遍历树的左侧部分,然后访问当前节点,然后递归遍历树的右侧部分 - 它们不是相互排斥的替代方案,需要按照这个顺序执行这三个步骤。尝试这样的事情:
(define (print-records node number)
(unless (empty? (node-left node))
(print-records (node-left node) number))
(print (node-value node)) ; replace this line with the actual printing code
(unless (empty? (node-right node))
(print-records (node-right node) number)))
一些解释:
(unless <condition> <body>)
只是(cond ((not <condition>) <body>))
。(print (node-value node))
为例,用当前节点值的实际打印代码替换该行。number
参数做什么,因为它只是被传递,未使用。答案 1 :(得分:2)
走二进制树是一种非常普遍的操作。您可以创建一般过程,然后使用要应用于每个节点的函数对其进行专门化。
(define (walker node function)
(unless (empty? node)
(walker (node-left node) function)
(function node)
(walker (node-right node) function)))
注意:最好在函数开头检查empty?
。
(define (print-records node number)
(walker node (compose print node-value))) ; ignore number, it seems.
你也可以这样做:
(define (walking-with function)
(letrec ((walker (lambda (node)
(unless (empty? node)
(walker (node-left node))
(function node)
(walker (node-right node))))))
walker))
(define print-records-for (walking-with (compose print node-value)))
(print-records-for node)
> ...