我有一个分配,其中我有一个树,其中所有父节点包含是或否问题,叶节点包含答案。每个父节点有两个子节点,一个是节点,一个是无节点。需要将此树序列化并通过RandomAccessFile存储在文件中,以便每次都不会将整个树写入文件。如果叶节点不包含用户正在寻找的答案,则用户提交新答案和问题以区分叶子的答案和他正在考虑的答案。然后这个叶子成为具有其自己的问题的父亲,并且两个孩子成为“是”节点和“否”节点(这两个节点是新叶子)。这个过程给我带来了麻烦,因为如果一个叶子已经写入文件,我怎么能覆盖叶子而不会溢出到另一个节点的数据(因为叶子节点的字节大小在它成为父节点时会改变)。请注意,程序可以随时终止,其树结构仍应保持不变。感谢
答案 0 :(得分:3)
让进程写入文件,记住可以随时终止进程... - >日记
节点的字节大小在成为父节点时会发生变化吗?让我们看看......
父节点有一个问题(对字符串的引用)
父节点具有yes节点(对节点的引用)
父节点具有无节点(对节点的引用)
叶子节点有答案(对字符串的引用)
叶子节点可能有2个未使用的引用到其他节点...
所以节点有一个字符串引用和2个节点引用...
如果两个节点引用都为NULL,则它是一个叶子节点,字符串ref是一个答案......否则它是一个父节点,字符串ref是一个问题......
将序列化为文件时:
你知道一个节点有一个固定的长度:3个指针(参考)
所以你的新字符串引用将是当前位置+ 3指针长度
将该地址写为字符串ref ...
现在写2个空引用...(我们还不知道这些节点的写入位置)
写字符串
遍历您的树并记住,当您知道文件中节点的位置时,您必须更新跳过的2个节点引用...
更新节点时(leaf成为父节点):
将新问题字符串写入文件,并存储其地址
存储当前答案字符串的地址...
用新的问题字符串地址
替换旧节点中的字符串引用
为旧答案写一个新节点(字符串ref是当前答案的存储地址)并更新其中一个旧节点节点引用(相应的是或否)
为另一个答案写一个新节点(字符串引用可以存储3个指针,所以地址已知)
写下新的答案字符串
更新旧节点的其他节点引用