繁体   English   中英

二叉树inorder遍历球拍

[英]Binary tree inorder traversal Racket

我正在尝试使用RACKET / DR编写用于二进制树的inorder遍历的算法。 球拍

 (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))。 我也试图做一个帮助程序,但这也不起作用。

你以错误的方式使用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参数做什么,因为它只是被传递,未使用。

走二进制树是一种非常普遍的操作。 您可以创建一般过程,然后使用要应用于每个节点的函数对其进行专门化。

(define (walker node function)
  (unless (empty? node)
    (walker (node-left  node) function)
    (function node)
    (walker (node-right node) function)))

注意:检查empty?是好的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)
> ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM