2012-03-12 76 views
1

我有一個分配,我有一棵樹,其中所有父節點都包含是或否問題,葉節點包含答案。每個父節點有兩個子節點,一個是節點和一個是無節點。這棵樹需要被序列化並且通過RandomAccessFile存儲在一個文件中,這樣整個樹就不會每次寫出到文件中。如果葉節點不包含用戶正在尋找的答案,則用戶提交一個新答案和一個問題以區分葉子的答案和他正在考慮的答案。然後,這片葉子成爲一個擁有自己問題的父母,兩個孩子成爲「是」節點和「否」節點(這兩個節點是新葉子)。這個過程給我帶來了麻煩,因爲如果葉已經寫出到文件中,我怎樣才能覆蓋葉而不會溢出到另一個節點的數據中(因爲葉節點的字節大小在成爲父節點時發生變化)。請注意,該程序可隨時被殺死,其樹狀結構仍應保持完整。由於序列化樹並存儲到RandomAccessFile

回答

3

有一個過程寫入文件,銘記該進程可以在任何時候......被殺死 - >日誌

的,當它變成父節點變化的字節大小?讓我們來看看......

父節點有一個問題(參考字符串)
父節點有一個是節點(參考節點)
父節點有沒有節點(參考節點)

葉節點有一個答案(參考爲一個字符串)
的葉節點可以具有到其它節點2層未使用的引用...

所以一個節點具有一個字符串參考和2的節點引用.. 。

如果兩個節點的參數都是NULL,它是一個葉節點,而字符串ref是一個答案......否則它是一個父節點,並且字符串ref是一個問題...

當您將其序列化到文件時:

你知道一個節點都有一個固定長度:3個指針(引用)
因此新的字符串引用將當前位置+ 3指針長度
寫爲字符串參考,解決...
寫2空引用現在...(我們還不知道那些節點將在哪裏寫入)
編寫字符串

遍歷您的樹,並記住,你有,當你知道在你的文件中的節點的位置更新跳過2節點引用...

當您更新節點(葉子會變成父):

將新的問題字符串寫入文件,並存儲它的地址
存儲當前答案字符串的地址...
用新的問題字符串地址替換舊節點中的字符串引用
爲舊答案(字符串ref是當前答案的存儲地址)編寫新節點並更新舊節點之一節點引用(是或無,相應地)
寫對方的回答(串可以參考3個指針後存儲一個新的節點,所以地址是已知的)
寫入新的答案串
更新舊的節點以外的節點的參考