好吧,这个问题需要你稍微阅读一下。我会尽量保持简短。
我有一棵树(不是二叉树,只是一棵树),其中包含与每个节点关联的数据(二进制数据,我不知道它们是什么,也不知道它们有多长)
树的每个节点也有一个与它在树中的显示方式无关的索引,为了简短起见,它可能是这样的:
索引号代表用户想要导航树的顺序,不能重复。
我需要将此结构存储在磁盘上的文件中。
我的问题是:如何设计一种灵活的磁盘存储格式,使加载和在树上工作尽可能容易。
实际上应该允许用户
- 为元素创建一个子块(这应该很容易,将数据添加到文件中就足够了,注意避免重复索引)
- 删除一个子节点(我应该提示用户“你想删除这个节点的所有子节点吗?还是应该将它的子节点添加到它的父节点?”)。关于这一点的棘手部分是删除节点也可以释放索引,并且我不能让用户在添加另一个节点时再次使用该索引(或者他设置的顺序可能搞砸了),我需要更新整棵树!
- 用另一个索引交换索引
我正在使用 C++ 和 Qt,现在我想到了很多结构,其中包含很多像这样的字段
struct dataToBeStoredInTheFile
{
long data_size;
byte *data; //... the data here
int index;
int number_of_children;
int *children_indices; // ... array of integers
}
这具有使用各自索引标识每个节点的优点,但是在两个节点之间交换索引或删除节点并更新彼此节点的索引时它非常慢,因为您必须遍历所有节点及其所有“children_indices”数组。
使用“哈希”之类的东西来识别每个节点会更灵活吗?我应该使用两个索引,一个用于树中的位置,一个用于用户索引吗?如果您有更好的存储数据的想法,欢迎您