[英]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.