Рекурсивный поиск на бинарном дереве

голоса
0

кто-нибудь может мне помочь отследить этот кусок кода, если его правильно или incorrect.i уча рекурсии в эти дни.

boolean search(Element element) {
    Element c=first;
    if(c==null)
        return false;
    else if(element.asset < c.asset)
        if(c.left==null)
            return false;
        else
            return search(c.left);
    else if(element.data>c.data)
        if(c.right==null)
            return false;
        else
            return search(c.right);
     else  
         return element.asset==c.asset;
}
Задан 07/08/2011 в 13:44
источник пользователем
На других языках...                            


3 ответов

голоса
3

ему не хватает остановить состояние. вы должны проверить , если t.left == NULL, или вы получите NullPointerException. Кроме того , вы должны вернуться t.left.isExist(..)ИЛИ t.right.isExist(...)и не isExist [вы хотите , чтобы вызвать этот метод на сыне]

В настоящее время, эта версия получит в бесконечный цикл - потому что вы всегда будете проверять в том же корневом узле.

Ответил 07/08/2011 в 13:47
источник пользователем

голоса
1

Ваш код не является симметричным.

для одной стороны, вы звоните isExist(t.left), на другой вы звонитеisExist(a.right)

Вы , вероятно , хотите , чтобы позвонить t.left.isExist(a)и t.right.isExist(a), но это чисто гипотетический , как вы не имеете полный SSCCE для нас , чтобы посмотреть.

Ответил 07/08/2011 в 13:52
источник пользователем

голоса
0

Это синтаксически правильный Java. Но я не понимаю, как это могло бы делать то, что вы собираетесь.

Оказывается, что параметр «элемент» является, что вы ищете и «первое» поле в текущем классе является корнем бинарного дерева.

Неясно , если ключ для бинарного дерева и поиска (в классе Element) является «активом» или «данные». «Меньше , чем» тест использует «актив», в то время как «больше чем» «данных» тест использует. Вполне вероятно , что обе линии должны использовать то же поле. Может быть , что одна из этих двух полей ( «активов» или «данные») должны не ссылаться в этом методе вообще. Может быть , последняя строка метода должна быть просто «возвращает истину;»?

(Я подозреваю, что «условие остановки» и «код не является симметричным» ответы выше и неправильно Но я могу ошибаться:. Трудно сказать только код, указанный.)

Я согласен, что зацикливания, вероятно: Я подозреваю, что вам нужно, чтобы создать вторую функцию «поиска», которая принимает два параметра «элемент» - одна из которых вещь для поиска (как текущего параметра «элемент»), а другой следующий элемент для поиска - эквивалент текущей локальной переменной «с». Я хотел бы сделать «Extract Method» рефакторинга на все в теле текущего метода «поиск», за исключением первой строки, а затем изменить два рекурсивных вызовов использовать новый метод.

(Некоторые из этих умозрительно, на основе я предполагаю, что вы хотите или намерены, учитывая ограниченный объем информации. Таким образом, я мог бы, конечно, совершенно неправильно.)

Ответил 09/08/2011 в 03:11
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more