У меня есть структура данных, которая выглядит как дерево:

A -> A 
  -> A
  -> A -> A -> A
       -> A
       -> A
       -> A

Обычно A может состоять из другого A или нескольких A(s).

Я хочу найти конкретный A с идентификатором.

public A findParticularA(int id)
{
    if(this.getID == id)
    {
        return this;
    }

    else
       findAHelper(this, id);
}

public A findAHelper(A root, int id)
{
    for(A a : root.getChildren())
    {
        if(a.getID == id)
           return a;

        else
            findAHelper(a, id);
    }

    return null;
}

Это работает, только если A, который я ищу, находится сразу после первого корня A.

  A -> A
    -> **A**   will be found

Но если я хочу, чтобы A находился глубже в дереве, это не сработает. Это потому, что я не вернусь правильно. Пожалуйста помоги.

0
J_Strauton 11 Май 2016 в 03:52

2 ответа

Лучший ответ

Вам нужно будет вернуть результат поиска Помощника в findParticularA.

В findAHelper цикл заставляет вас опустить глубоко вниз три ветви дерева; надеюсь, что из этих ветвей вернется пятерка, но она вернется не из всех, а только из одной. Остальные (или все они) вернут null.

Итак, вам нужно поймать возвращаемое значение findAHelper, посмотреть, является ли оно нулевым или нет, чтобы решить, возвращать ли его - если это A (не null), вернуть его, в противном случае не делать и позволить циклу продолжаться вниз по следующему дереву ветка.

Я не могу правильно написать это на Java, но предлагаю следующее изменение:

public A findParticularA(int id)
{
    if (this.getID == id) 
    {
        return this;
    }  
    else 
    {
        return findAHelper(this, id);  # here
    }
}

public A findAHelper(A root, int id)
{
    for(A a : root.getChildren())
    {
        if(a.getID == id) 
        {
            return a;
        }
        else
        {
            tmp = findAHelper(a, id);    # here
            if (tmp is not null) {       #
                return tmp               #
            }
        }
    }
    return null;
}
2
TessellatingHeckler 11 Май 2016 в 01:04

Сделать это можно одним способом. Вам не нужен findParticularA

public A findA (A root, int id)
{
    if (root.getID == id)
        return root;

    A[] children = root.getChildren(); 

    A res = null;
    for (int i = 0; res == null && i < children.length; i++)
    {         
        res = findA(children[i], id);
    }
    return res;
}

Просто позвоните с помощью:

A a = findA(this, id);
2
Michael Markidis 11 Май 2016 в 01:25