2014-07-28 6 views
0

Я пытаюсь выполнить операцию поиска в BT. Например:Поиск в двоичном дереве (BT) Not BST

 3 (Root) 
    5  1 
6 2 0 8 

Это мой БТ, и это код, который я написал для поиска.

Node* search(Node *root,int key) 
{ 
    if(root) 
    { 
     if(root->key==key) 
     { 
      cout<<root->key<<endl; 
      return root; 
     } 
     search(root->left,key); 
     search(root->right,key); 
    } 
} 

Сво предзаказ обход с условием, что, когда я нахожу нужный мне узел, я должен вернуть его. Например, если я вызываю поиск (корень, 2), поиск должен возвращать указатель Node * к узлу, содержащему значение 2.

Я считаю, что когда мой код возвращается после выполнения условия, он возвращается только к внешнему вызов n не выходит полностью. Например, если A вызывает B вызывает C, n, то есть возврат в C, он возвращает значение B, а не функцию, которая называется A.

Я не могу понять, как решить эту проблему , Я до сих пор совершенно новичок в рекурсии, поэтому мне сложно визуализировать вещи.

Любая помощь оценена!

+0

Вы должны ' return search (root-> left, key) 'и' return search (root-> right, key); '. Кроме того, вы должны вызывать эти функции, если предыдущая операция (поиск в самом узле и 'search (root-> left, key)', соответственно) не нашел значение. –

+1

Не ссылайтесь на код, размещенный где-то в другом месте. Поместите соответствующие разделы кода в свой вопрос, чтобы получить хороший ответ. –

+0

Привет @Mohit Jain, Спасибо, я помню, что в моих будущих просьбах. – user2171983

ответ

1

Вопрос 1: вам не нужно возвращать значение, если вы не нашли требуемое значение. return NULL; в конце вашей функции.

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

Node* r = search(root->right, key); 
if (r) return r; 
+0

Привет, Я пытаюсь отформатировать свой блок кода, но его не работает, так что вставляем мой код в папку. com {Я использую 4 пробела перед кодовой строкой и 2 пробела в конце для разрыва строки
} Не знаю, почему редактор не подбирает его. Поэтому я поменял свой код на этот http://pastebin.com/iDsG7yei, и теперь, когда у меня есть ключ поиска в левом поддереве, он не переходит в состояние NULL и может выполнять поиск, но с ключом справа , он возвращает NULL и никогда не переходит в правильное поддерево. – user2171983

+0

Да, вы хотите вернуть результат поиска в левом поддереве, только если он возвращает результат. Если он возвращает NULL, он должен продолжить и выполнить поиск в правом поддереве. –

0
Node* search(Node *root, int key){ 
    if(root){ 
     if(root->key == key){ 
      return root; 
     } 
     Node *ret; 
     (ret = search(root->left, key)) || (ret = search(root->right, key)); 
     return ret; 
    } 
    return NULL; 
} 
+0

Это работает потрясающе! еще раз спасибо. Я также понял, что я делаю неправильно. – user2171983

0

Добавить функцию выхода после того, как условие выполняется, чтобы уменьшить накладные расходы program.Also добавить условие не найден

if(root->key==key) 
    { 
     cout<<root->key<<endl; 
     return root; 
     exit(-1); 
    } 
Смежные вопросы