Q
從樹
0
A
回答
1
因此,這裏是你的測試:
(maxi
(Nd
1
(Nd 2
(Nd 4
(Nd 8 'E 'E)
(Nd 9 'E 'E))
(Nd 5 'E 'E))
(Nd 3
(Nd 6 'E 'E)
(Nd 7 'E 'E)))
0)
這裏是發生了什麼:
acc root what to do?
---------------------------------
0 1 go left with acc = root
1 2 idem
2 4 idem
4 8 idem
8 E return 8
如果你希望你的輸入樹以滿足binary search tree性質,指出在左子樹的值總是比右側子樹的根和值都小或相等,則測試樹是畸形的BST,因爲9大於4.
By如果您有BST,那麼最大值將位於何處?
但是,如果樹只是一棵隨機樹,那麼在能夠確定總體最大值之前,必須計算兩個子樹的最大值和根值。
基本上,你想做的事:
(tree-max (Nd root left right)) = (max root
(tree-max left)
(tree-max right))
如果你想遞歸地做到這一點,你會遇到在基本情況下的問題,因爲你將有一個空的葉節點提供最大價值:您將選擇的任何值都會使您的代碼對包含嚴格低於該值的值的樹不正確。假設你選擇零並計算只有嚴格負數的樹的最大值,那麼零就是錯誤的答案,因爲它不出現在樹中(你能做什麼?)。
您可以選擇使用累加器而不是遞歸,但在這種情況下,您將需要兩個累加器:迄今爲止的最大值和下一個要訪問的子樹的列表。基本上你用堆分配堆棧替換調用堆棧。
我目前無法測試下面的代碼,但這裏是一個可能的實現:
(define tree-max (tree greatest todo)
(match tree
('E greatest (if (null? todo)
greatest
(tree-max (first rest)
greatest
(rest todo))
((Nd root left right) (tree-max left
(max greatest root)
(cons right todo))))
相關問題
- 1. 從樹
- 2. 從樹上
- 3. 遞歸從樹
- 4. Contruct樹從表
- 5. 迭代從樹
- 6. 從樹狀
- 7. 從樹(n-ary)創建二叉樹
- 8. 從二叉樹中找到子樹
- 9. 從通用樹到域特定樹
- 10. 從樹入樹脂莖和葉
- 11. 從JSON抓取樹
- 12. 從樹拖到div
- 13. 從B樹刪除
- 14. 從一個Git樹
- 15. 構建樹從表
- 16. 樹形從字典
- 17. 榆樹:從列表
- 18. 創建從樹幹
- 19. 榆樹取得Html從不
- 20. 從csv生成樹結構
- 21. 樹莓派 - 從儀表
- 22. 遞歸函數從樹
- 23. 從數據庫加載樹
- 24. ExtJS4:從樹拖到面板
- 25. 函數從JSON在DHTMLX樹
- 26. 從二叉搜索樹
- 27. 迭代TreeSet的 - 從樹狀
- 28. 從表達式樹C#
- 29. 從嵌套集生成樹
- 30. 從樹打印匹配
什麼是預期的輸出?返回的是什麼?你有沒有嘗試[追蹤](https://docs.racket-lang.org/reference/debugging.html)? – coredump
期望的輸出是9,但我得到8 – testomg
這樣的樹的整個點是,它將被排序,因此最深的右邊節點將保持最大值,但你的樹沒有排序,所以我想也許你的例子數據是錯誤的。如果這個節點比父節點大,忽略正確的節點,或者只是按照右邊節點忽略左邊,你的代碼似乎跟在左邊。這個不成立。 – Sylwester