2013-04-20 8 views
1

я имею нормальное бинарное дерево, которое я пытаюсь применить итерационные глубины Углубления первого поиск по использованию C:Итерационного Углубление глубины первого поиск в бинарном дереве

struct node { 
    int data; 
    struct node * right; 
    struct node * left; 
}; 

typedef struct node node; 

и я использую функцию для вставки узлов в дерево, теперь мне нужно реализовать функцию поиска, чтобы быть что-то вроде этого: function search(root,goal,maxLevel) поэтому поиск по глубине первого поиска, но до определенного уровня максимального затем остановить , которая была моя первая попытка, она не работает:

currentLevel = 0; 
void search(node ** tree, int val, int depth) 
{ 
    if(currentLevel <= depth) { 
     currentLevel++; 
     if((*tree)->data == val) 
     { 
      printf("found , current level = %i , depth = %i", currentLevel,depth); 

     } else if((*tree)->left!= NULL && (*tree)->right!= NULL) 
     { 
      search(&(*tree)->left, val, depth); 
      search(&(*tree)->right, val, depth); 
     } 
    } 
} 

пожалуйста, помогите, спасибо ...

+0

Опишите * что * не работает. –

+0

Почему вы не уменьшаете глубину каждый раз, когда идете глубже? Затем проверьте, чтобы оно было больше нуля. – Kninnug

+0

Вероятно, вам не нужна глобальная переменная 'currentLevel()'. Вероятно, вам не следует искать как левый, так и правый поддеревья - вам, вероятно, следует искать левое поддерево, если значение меньше, чем значение в текущем узле, и правое поддерево, если значение больше, чем значение в текущем узле. Вероятно, вам нужно вернуть указатель на узел, где было найдено значение; вам может понадобиться какой-то способ отличить «не найден», «слишком глубоко» и «найден». –

ответ

2

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

node *search(node ** tree, int val, int depth) 
{ 
    if (depth <= 0) 
    { 
     return NULL; // not found 
    } 

    if((*tree)->data == val) 
    { 
     return *tree; 
    } 

    if((*tree)->left) 
    { 
     node * left = search(&(*tree)->left, val, depth - 1); 
     if (left) return left; // found 
    } 
    if((*tree)->right) 
    { 
     node * right = search(&(*tree)->left, val, depth - 1); 
     return right; // whatever is result of right 
    } 
    return NULL; // not found 
} 
+0

Эта реализация уменьшит глубину в два раза (1 в левом рекурсивном вызове и 1 справа), чтобы она не достигла желаемой глубины. – Heidar

+1

@HeidarMostafa, вы ошибаетесь. –

1

глобальная переменная не будет работать для этого. Вы хотите иметь что-то вроде

void search(node ** tree, int val, int remainingDepth) { 
    if (remainingDepth == 0) return; 

затем

 search(&(*tree)->left, val, remainingDepth - 1); 
     search(&(*tree)->right, val, remainingDepth - 1); 

вероятно Вы также хотите проверить оставил & право на нуль по отдельности, так как каждый из них может быть независимо друг от друга нуль.