填充trie没问题。单词不包含数字或空格,只包含小写字母。
printTrieContents使用main中的malloced缓冲区。
问题: 如果trie包含“得分”和“某事”字样,则会打印“得分”但不会打印“某事”。
其他一切都没问题。
struct trieNode {
int count;
struct trieNode *children[ALPHA_SIZE];
};
void printTrieContents(struct trieNode *root, char *buffer, int buffIndex){
int i;
for(i = 0; i < ALPHA_SIZE; i++){
if(root->children[i] != NULL){
buffer[buffIndex] = i + 'a';
printTrieContents(root->children[i], buffer, buffIndex + 1);
}
if(!hasChildren(root)){
buffer[buffIndex] = '\0';
if(strlen(buffer) > 0){
printf("%s: %d\n", buffer, root->count);
buffIndex = 0;
}
}
}
}
int hasChildren(struct trieNode *root){
int i;
for(i = 0; i < ALPHA_SIZE; i++){
if(root->children[i] != NULL){
return 1;
}
}
return 0;
}
答案 0 :(得分:1)
你最终会走向一片叶子。在这一点上,作为一片叶子,你没有孩子。你加上null 并将buffIndex设置为零。你不会退出,你继续旋转,这意味着你将回到那个子句并将buffer [0]设置为Null,有效地清除你的字符串,你最终会重新递归并转移到下一个孩子。< / p>
编辑:当你检测到需要加上null时,而不是设置buffIndex(注意,buffIndex对于当前帧是本地的,设置它对其余的没有任何影响)你的调用堆栈)返回。您将开始递归备份堆栈。然后你将回到一个有更多孩子的框架,你可以开始迭代其他孩子,用新字符串覆盖缓冲区,然后打印新单词。