Java can';无法使insert方法在trie数据结构中工作

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

我正在尝试为trie实现insert方法,因此预期的结果是,我添加的元素将存储在与关键字的最后一个字符相对应的节点中,而包含其他字符的节点则没有元素,但我的方法实际上是将其存储在每个节点中,我不知道为什么。这是我的实际代码:

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;**