为何在Trie插入函数中使用pCrawl而非直接操作root节点?
为什么Trie插入操作要创建
pCrawl而不是直接用root节点? 先看你给出的插入代码:
void insert(struct TrieNode *root, string key) { struct TrieNode *pCrawl = root; for (int i = 0; i < key.length(); i++) { int index = key[i] - 'a'; if (!pCrawl->children[index]) pCrawl->children[index] = getNode(); pCrawl = pCrawl->children[index]; } // mark last node as leaf pCrawl->isEndOfWord = true; }
核心原因有两个:
必须保留根节点的原始位置
root是整个Trie树的唯一入口,所有后续的插入、查询、删除操作都要从root开始。如果直接用root指针遍历,循环里root = root->children[index]会不断改变root的指向,函数执行完后,root会指向当前插入单词的最后一个节点——这就等于把整个Trie树的"大门"弄丢了,下次再操作时根本找不到树的起始位置。遍历过程需要临时指针
插入单词的过程本质是从根节点出发,沿着字符对应的路径向下走,每一步都要移动到下一层的子节点。pCrawl就是这个用来"爬"树的临时指针,它的作用是在遍历过程中记录当前所在的节点位置,同时完全不影响root的原始指向。
举个实际的例子:如果插入单词"cat"时直接操作root,第一次循环后root会指向'c'对应的节点,第二次指向'a',最后指向't'。当你再插入"car"时,root已经在't'节点了,根本找不到'c'的位置,整个逻辑直接崩盘。
内容的提问来源于stack exchange,提问作者user19384552
相关产品推荐
相关产品推荐

