string - Trie 插入或读取操作中的逻辑问题
问题描述
我正在尝试 Trie 中的插入操作和以下实现的读取操作我在插入时遇到问题。我认为读取操作没有任何问题。在我的例子中,Trie 的每个节点都有一个节点指针数组和一个值字段。另外,我在理论上标记每个字符插入,每个节点都有大写字符和整数值。例如:假设要添加 3 个字符串,分别为ATAGA、ATC和GAT ,因此每个字符都有一个值,该值将由代码中的“ pass ”变量给出,有关更多详细信息,请参见预期输出。
import java.util.*;
class node{
public int val;
public node ptrs[];
node(){
this.val =0;
ptrs = new node[26];
for (node ptr : ptrs) {
ptr = null;
}
}
}
class Tree{
public node root = new node();
public int pass =0;
void insert(String s) {
node trv = root;
for (int i = 0; i < s.length(); i++) {
if (trv.ptrs[s.charAt(i) - 'A'] == null) {
trv.ptrs[s.charAt(i) - 'A'] = new node();
trv.val = ++pass;
// System.out.println(s.charAt(i)+" val : "+trv.val);
}
trv = trv.ptrs[s.charAt(i) - 'A'];
}
}
private void visit(node trv){
for(int i =0;i<26;i++){
if(trv.ptrs[i]!=null){
System.out.println((char)(i+'A')+" : "+trv.val);
visit(trv.ptrs[i]);
}
}
}
void call(){
this.visit(root);
}
}
public class trie {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Tree t = new Tree();
while (n-- > 0) {
String s = sc.next();
t.insert(s);
}
t.call();
sc.close();
}
}
我的输出:
3
ATAGA
ATC
GAT
A : 7
T : 2
A : 6
G : 4
A : 5
C : 6
G : 7
A : 8
T : 9
预期输出:
3
ATAGA
ATC
GAT
A : 1
T : 2
A : 3
G : 4
A : 5
C : 6
G : 7
A : 8
T : 9
解决方案
我已经测试了更改,并且可以看到您提到的预期输出。
您必须在插入期间更新子节点 val 和 ptrs 数组而不是父节点。
for (int i = 0; i < s.length(); i++)
{
if (trv.ptrs[s.charAt(i) - 'A'] == null)
{
trv.ptrs[s.charAt(i) - 'A'] = new node();
trv.ptrs[s.charAt(i) - 'A'].val = ++pass;
}
}
同样在搜索/访问期间,从当前节点的子节点获取值。
for(int i=0;i<26;i++)
{
if(trv.ptrs[i]!=null)
{
System.out.println((char)(i+'A')+" : "+trv.ptrs[i].val);
visit(trv.ptrs[i]);
}
}
推荐阅读
- python-3.x - 卸载特定的python
- eclipse - eclipse中的断点没有勾选
- ruby-on-rails - 没有名称或电子邮件地址的行从 CSV 导入导入数据库
- r - 在 R 的 base/dplyr 中,找到最接近数据集每一行的行
- javascript - 如何在 HTML 页面中使用参数启动 js 函数
- java - Java 哈希表和哈希映射
- html - 我的对话框组件未在 Reactjs 中显示
- sql - 如何通过 ALTER TABLE 添加 CHECK 约束?
- django - 带有内联的 Django-cms CMS 插件一旦创建内联就不会出现在编辑模式下
- javascript - 从 javascript 获取 HTML 元素属性