如何在SML中實現一個獲取樹並返回列表的函數。根據樹的後序掃描,列表由樹節點中的值組成。SML - 如何創建樹的後序掃描列表
樹datatype
是:
datatype 'a Tree = Leaf | Branch of 'a * 'a Tree * 'a Tree;
如何在SML中實現一個獲取樹並返回列表的函數。根據樹的後序掃描,列表由樹節點中的值組成。SML - 如何創建樹的後序掃描列表
樹datatype
是:
datatype 'a Tree = Leaf | Branch of 'a * 'a Tree * 'a Tree;
,可以簡單地這樣做:
fun createList(Leaf) = []
= | createList(Branch(el, left, right)) = createList(left) @ createList(right) @ [el];
如果你有一個分支首先訪問它的左子樹(createList(left)
),那麼它的右子樹(createList(right)
),然後追加元素el
,所以基本上做一個後序樹遍歷。如果你想從Leaf
(空樹)創建一個列表,結果將是一個空列表。
一個更有效的解決方案:
local
fun helper Leaf result = result
| helper (Branch (el, left, right)) result = helper left (helper right (el::result))
in
fun createList tree = helper tree nil
end
這是更有效,因爲@
具有完全放鬆它的左側參數將其預先考慮到右手的說法,這會變得非常昂貴,如果你重複申請它到更長和更長的列表。相比之下,通過使用一個helper
函數來預先將子樹的後序遍歷到傳入的列表中,您可以只構建一次整個列表。
謝謝,我的語法有問題......你的解決方案幫助我:) – alexpov 2011-04-30 12:24:45