回答
注意:重寫了答案,以前的版本是不正確的。
對於一般二叉樹(具有獨特的元素)您的陳述將是正確的。考慮這兩個輸入(不是很嬌滴滴地繪製;-)):
如果這些序列使用中序遍歷,無論是產量ABC
。其他遍歷類型也存在類似的情況。
那麼,爲什麼有序和預購的組合足夠?
預購的序列化形狀爲[root][left subtree][right subtree]
。根很容易識別,但是你不知道左側子樹的結束位置和右側子樹開始的位置。
現在考慮按序序列化:[left subtree][root][right subtree]
。你知道根源是什麼(感謝預購),所以識別左右子樹非常容易。
請注意,如果權重不是唯一的,這仍然不夠。如果在上面的示例中,我們將B
更改爲A
,那麼對於這兩種遍歷類型,兩棵樹都會產生[AAC]
。
對於二叉搜索樹反序列化要容易得多。爲什麼?那麼,每個子樹都具有左子樹中的節點小於根,而右子樹中的節點更大的屬性。因此,預購序列號[root][left subtree][right subtree]
可以很容易和明確地再次解析。所以,最後,告訴你至少需要兩個序列化方法的BST的人是錯誤的(也許他也忘記了BST的屬性)。
出於某種原因,我認爲他的意思是Java序列化,但這個答案清楚地解釋了一個簡單的「字符串序列化」是足夠的。 –
比我的答案更徹底/清晰;)。謝謝! – dwanderson
在序列化時按某種順序存儲BST可能會使構建時的檢索更簡單。想象一下,你有你的BST,只是隨機挑選節點來序列化和存儲。當檢索時,它將按照存儲的順序檢索,然後將不得不通過並連接所有節點。雖然這應該是可能的 - 所有的信息都在那裏 - 似乎沒有必要。每個節點都是浮動的;反序列化過程/程序必須保持所有節點(或類似節點)的列表,當它逐行瀏覽連接的列表時。另一方面,如果您按照某種規定的順序存儲它們,則它可以構建樹,而在每個節點中讀取 - 它知道在哪裏連接節點,因爲它們按順序排列(爲了清楚起見:並不意味着下一個節點必須連接到先前讀取的節點,在相鄰的樹葉的情況下;只需將足夠的級別跳轉到適當的分支就簡單多了)。這應該更快,並可能使用更少的內存(建設時沒有列表/容器)。
- 1. 什麼時候應該使用JSON序列化,爲什麼?
- 2. 序列化BST樹
- 3. Rails壞哈希序列化...有時候?
- 4. 爲什麼在反序列化的時候JSON.NET不能使用繼承
- 5. 爲什麼在'有'的時候有'where'
- 6. 我什麼時候需要序列化一個對象?
- 7. Java:你想要什麼時候自定義序列化過程?
- 8. Java:什麼時候序列化非序列化對象或將它們設置爲瞬態?
- 9. 爲什麼可序列化的內部類不可序列化?
- 10. 什麼樣的對象被序列化,爲什麼?我什麼時候可以使用這個?
- 11. 什麼時候應該在.NET框架中使用XML序列化與二進制序列化?
- 12. 線性序列需要什麼時候有Vector?
- 13. 爲什麼序列化對象需要序列化
- 14. 爲什麼二進制序列化比xml序列化更快?
- 15. 衝突序列化和序列化之間有什麼區別?
- 16. XML序列化 - 有什麼不對的
- 17. 程序什麼時候什麼都沒有提示
- 18. 爲什麼在打印BST的前序遍歷時,我的程序什麼都不做
- 19. 爲什麼MvvmCross沒有導航對象的內在序列化?
- 20. 爲什麼我的List沒有在JAXB中序列化?
- 21. 什麼時候應該/不應該在Spark中序列化一個類?
- 22. 爲什麼序列化模型類
- 23. 爲什麼整個HttpResponseMessage序列化?
- 24. 爲什麼定製Java序列化
- 25. 爲什麼wicket頁面被序列化?
- 26. 爲什麼CLLocation不能序列化?
- 27. 爲什麼SAXException可序列化?
- 28. 爲什麼不序列化它?
- 29. 什麼時候需要一個序列化對象中的自定義readObject/writeObject?
- 30. 爲什麼Spark在使用Kryo序列化時表現更差?
我確信有人可以證明有序+預購或有序+後序是需要重建BST。但老實說,我會將它與父/子關係和每個節點的數據序列化。 –
你在說什麼? –