C++实现Trie树需定义轻量节点(含unordered_map子节点映射和isEnd标记),支持插入(逐字符建路径并设末尾isEnd)、查找(路径存在且isEnd为true)和前缀匹配(仅需路径存在)。

<p>用C++实现Trie树,核心是每个节点存储字符映射关系(常用<code>unordered_map</code>或固定大小数组),并标记是否为单词结尾。关键在于插入、查找、前缀匹配三个操作的逻辑清晰和内存安全。</p>
<H3>节点设计:轻量且支持动态扩展</H3>
<p>Trie节点不需存字符本身(由父节点的映射键隐含),只需:<br>
- 一个从字符到子节点指针的哈希表(如<code>unordered_map<char, TrieNode*></code>),适合稀疏字符集;<br>
- 一个<code>bool isEnd</code>标记该位置是否构成完整单词。<br>
避免使用26字母数组(限制为小写英文),除非明确场景且追求极致速度。</p>
<p>示例节点定义:</p>
<font color="#888">
<pre><code>struct TrieNode {
unordered_map<char, TrieNode*> children;
bool isEnd = false;
};</code></pre>
</font>
<H3>插入字符串:逐字符向下创建路径</H3>
<p>从根开始,对字符串每个字符:<br>
- 若当前节点无该字符的子节点,新建一个;<br>
- 沿<code>children[c]</code>走到下一层;<br>
- 遍历结束后,将末尾节点<code>isEnd</code>设为<code>true</code>。</p>
<p>注意:无需检查重复插入,重复插入同一单词只改变<code>isEnd</code>状态,不影响结构。</p>
<H3>查找完整单词:必须走到末尾且<code>isEnd == true</code></H3>
<p>逐字符匹配,中途任一字符缺失即返回<code>false</code>;<br>
成功到达末尾后,还需确认<code>isEnd</code>为<code>true</code>——否则只是某个长单词的前缀,不算“查到该词”。<br>
例如插入"apple"后查找"app"应返回<code>false</code>(除非也显式插入过"app")。</p>
<H3>前缀匹配:只需走完前缀路径,不检查<code>isEnd</code></H3>
<p>逻辑与查找单词类似,但只要能顺利走完所有前缀字符就返回<code>true</code>;<br>
常用于自动补全、字典提示等场景。<br>
可复用查找逻辑,仅省略最后的<code>isEnd</code>判断。</p>
<p>补充建议:<br>
- 根节点始终为空,不对应任何字符;<br>
- 使用智能指针(如<code>unique_ptr<TrieNode></code>)可简化内存管理,避免手动<code>delete</code>;<br>
- 若确定字符集极小(如仅'a'-'z'),可用<code>vector<TrieNode*> children(26, nullptr)</code>提升缓存局部性。</p>