2013-11-08 3 views
0

ниже является функцией searchVal для поиска значения в двоичном дереве. узлы двоичного дерева хранятся в векторе nodeVec с первым объектом в векторе как root., почему эта функция не возвращает ожидаемое значение

структура узлов

class bst{ 
public: 
    //other functions..// 
    int searchVal(int) 
private: 
    bst *lLink; 
    int info; 
    bst *rLink; 

}

вызова часть в главном

cout << "Enter Value to search "; 
int val; 
cin >> val; 
int ret = nodeVec[0].searchVal(val); 

if (ret == 2) 
    cout << "Value Not Found" << endl << endl; 
else 
    cout << "Value Found" << endl << endl; 

Функция

int bst::searchVal(int val) 
{ 
    if (info != val) 
    { 
     if (info > val) 
     { 
      if (lLink != NULL) 
       lLink->searchVal(val); 
      else 
       return 2; 
     } 
     if (info < val) 
     { 
      if (rLink != NULL) 
       rLink->searchVal(val); 
      else 
       return 2; 
     } 
    } 

    if (info == val) 
     return 1; 
} 

во время отладки (с использованием codeBlocks) я заметил, что после выполнения любого условия, например, если выполнено условие info==val, указатель выполнения (стрелка в IDE, указывающей на обрабатываемую линию) заканчивается searchVal, после чего он перейдите к ближайшему if (с конца), однако он не входит в блок этого условия. Он всегда возвращает info хранится в корневом узле в ret не 1 или 2

+1

Как вы инициализируете 'info'? –

+0

@VusP - это еще одна часть всего кода, который использует вектор для принятия значений от пользователя и от этого вектора, создает глобальный вектор «nodeVec» объектов и связывает узлы (используя rLink, часть lLink) в соответствии с критериями, требуемыми для создать двоичное дерево поиска. Но это не проблема, каждая часть работает нормально, даже обход для поиска значения хорошо работает, только проблема заключается в том, что 'searchVal' не возвращает ожидаемое значение i.e,' 1' или '2' – Rahul

+0

у вас уже есть решение Peter. Я просто подумал, что, возможно, ему нужно что-то сделать с неправильной инициализацией 'info'. –

ответ

3

Я думаю, что главная проблема в вашем коде, что вы» не возвращать результат поиска поддерева; то есть вы должны делать это:

if(lLink!=NULL) 
    return lLink->searchVal(val); 

Вы упускаете return ключевое слово. Это означает, что некоторые пути выполнения проходят весь путь до конца функции и никогда не попадают в return, что потенциально очень плохо. Однако компилятор должен сообщить об ошибке или предупреждении об этом.

+0

спасибо за ответ и разъяснение проблемы – Rahul

3

searchVal функция должна возвращать значение на каждом пути кода - все остальное будет иметь неопределенное поведение (что означает, что все может случиться).

Добавить return на ваш телефон: lLink->searchVal и rLink->searchVal.

(И если ваш компилятор не предупредит вас об этом, то Вам необходимо включить это предупреждение.)

4

Должно быть

if(lLink!=NULL) 
    return lLink->searchVal(val); 
    ^^^^^^ 
Смежные вопросы