Java can';无法使insert方法在trie数据结构中工作
我正在尝试为trie实现insert方法,因此预期的结果是,我添加的元素将存储在与关键字的最后一个字符相对应的节点中,而包含其他字符的节点则没有元素,但我的方法实际上是将其存储在每个节点中,我不知道为什么。这是我的实际代码:Java can';无法使insert方法在trie数据结构中工作,java,algorithm,data-structures,Java,Algorithm,Data Structures,我正在尝试为trie实现insert方法,因此预期的结果是,我添加的元素将存储在与关键字的最后一个字符相对应的节点中,而包含其他字符的节点则没有元素,但我的方法实际上是将其存储在每个节点中,我不知道为什么。这是我的实际代码: public boolean agregar(String palabra, T elemento)throws Exception { boolean resp=false; if(palabra.length()==1) { if
public boolean agregar(String palabra, T elemento)throws Exception
{
boolean resp=false;
if(palabra.length()==1)
{
if(hijo!=null)
{
NodoArbolTrie<T> nodo= new NodoArbolTrie<T>(palabra.charAt(0),elemento);
resp= hijo.agregarHermano(nodo);
}
else
{
hijo= new NodoArbolTrie<T>(palabra.charAt(0),elemento);
hijo.cambiarPapa(this);
resp= true;
peso++;
}
}
else
{
NodoArbolTrie<T> nodo= new NodoArbolTrie<T>(palabra.charAt(0),null);
if(hijo!=null)
{
boolean resp2= hijo.agregarHermano(nodo);
if(resp2)
resp=nodo.agregar(palabra.substring(1), elemento);
}
else
{
hijo= nodo;
hijo.cambiarPapa(this);
peso++;
resp=nodo.agregar(palabra.substring(1), elemento);
}
}
return resp;
}
这是给agregarHermano()的:
public boolean addBrother(NodoArbolTrie nodo)throwsException
{
布尔resp=false;
if(nodo.getCharacter()>caracter)
{
if(兄弟!=null)
{
if(brother.getCharacter()>nodo.getCharacter())
{
诺多·塞布罗瑟(赫尔马诺);
nodo.setParent(父级);
挫折者(野多);
resp=真;
权重++;
}
否则{
resp=兄弟受挫者(nodo);
}
}
否则{
nodo.setParent(父级);
挫折者(野多);
resp=真;
权重++;
}
}
else if(nodo.getCharacter()在trie数据结构中,您有一个子项列表,而不是一个子项。在添加新节点之前,您需要检查节点是否已具有第一个字符
我不知道你的hijo.addhermano是做什么的。发布该函数可能会有所帮助
此外,以下内容可能会发生变化
new NodoArbolTrie<T>(palabra.charAt(0),elemento);
newnodoarboltrie(palabra.charAt(0),elemento);
到
newnodoarboltrie(palabra.charAt(0),elemento.substring(1,elemento.length());
这是您的问题。要标记节点包含匹配元素,您需要存储一个布尔标志,说明这是否是元素的结尾
public NodoArbolTrie(char caracter,T elemento){
this.caracter=caracter;
**this.elemento=elemento;**
这应该是
public NodoArbolTrie(char caracter,bollean isEndOfWord){
this.caracter=caracter;
**this.isEndOfWord=isEndOfWord;**
要检索元素列表或检查字典中是否有单词,请遍历子元素(示例中还有兄弟元素),并检查(1)下一个字符是否存在和(2)如果该标志设置为true。这将构造一个wrod我被告知容器是实现它的一种方式,另一种方式是每个节点只知道它下面的节点和它旁边的节点,或者它的第一个子节点和兄弟节点。但问题不在于此或子字符串,因为它按t的顺序添加了正确的节点hey应该被添加,但问题是我似乎在每个节点中存储元素,我不知道为什么可以使用容器方法。你能发布新节点的代码吗。你的问题很可能存在于代码中。此外,我仍然不明白为什么你的节点同时包含第一个字符和整个元素。它应该只包含第一个字符。有一些方法。节点只包含其字符,可能包含元素,也可能不包含元素,这就是为什么我在那里使用(palabra.charAt(0),null)创建了一些节点,我本来打算让它们没有任何元素。但我仍然看不出有什么错误。请参阅下一个响应。我在尝试内联回答时遇到了格式问题
new NodoArbolTrie<T>(palabra.charAt(0),elemento);
new NodoArbolTrie<T>(palabra.charAt(0),elemento.substring(1,elemento.length());
public NodoArbolTrie(char caracter,T elemento){
this.caracter=caracter;
**this.elemento=elemento;**
public NodoArbolTrie(char caracter,bollean isEndOfWord){
this.caracter=caracter;
**this.isEndOfWord=isEndOfWord;**