簡體   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