我正在编写一个trie作为练习练习,用于学习C中的一些基础知识。我的插入,删除和搜索功能似乎工作正常。但是,我不太确定我的函数是否会尝试返回Trie根节点占用的字节数。
unsigned int memory_trie_node(struct TrieNode *node)
{
int i;
for (i = 0; i < LETTER_COUNT; i++)
{
struct TrieNode *next = node->children[i];
if (next != NULL)
{
return sizeof(next) + memory_trie_node(next);
}
}
return 0;
}
这是我的结构定义
struct TrieNode {
struct TrieNode* children[LETTER_COUNT];
int wordEnds; // 1 if string ends at this node, 0 else
};
struct Trie {
struct TrieNode* root;
};
我创建一个新的trie节点的方式似乎工作得很好,就像我动态分配内存的方式一样,但如果需要,我可以包含其他功能。
我的memory_trie_node功能是否正确?如果没有,我该怎么做才能解决它?
谢谢
答案 0 :(得分:4)
我建议对递归方法稍作修改:在函数开头处理当前节点,只考虑循环中的子节点:
unsigned int memory_trie_node(struct TrieNode* node)
{
int i, memory;
if (!node) return 0;
memory = sizeof(struct TrieNode); // self size
for(i = 0; i < LETTER_COUNT; i++)
{
memory += memory_trie_node(node->children[i]);
}
return memory;
}
答案 1 :(得分:2)
for(i = 0; i < LETTER_COUNT; i++) {
struct TrieNode* next = node->children[i];
if (next != NULL) {
return sizeof(next) + memory_trie_node(next);
}
}
您只是计算第一个non null
孩子的大小并在non null
孩子上递归,但其他孩子的情况如何。您不要让循环完成。
您还必须考虑当前节点。即使节点的所有子节点都是null
,所以大小不应该是zero
unsigned int totalMemory=0;
if(node == NULL)
return 0;
for(i = 0; i < LETTER_COUNT; i++) {
struct TrieNode* next = node->children[i];
if (next != NULL) {
totalMemory+= memory_trie_node(next));
}
}
return totalMemory + sizeof(struct TrieNode);
编辑:添加案例来处理node=null
的情况。在这种情况下,大小应为零