2015-05-12 10 views
0

Привет, stackoverflowers, У меня возникла проблема с моей функцией в C, я хочу создать функцию, которая даст мне минимальное и максимальное значение в BST. Проблема заключается в том, когда я использую эту функцию возвращает то же значение для мин и макс:Найти максимальное и минимальное значение BST

void Find_Min_Max(node *bt,int* maxint,int* minint) 
{ 
    node *tmp = bt; 
    if(bt == NULL) 
    { 
     *maxint = 0; // Only if the tree contains nothing at all 
     *minint = 0; // Only if the tree contains nothing at all 
    } 
    if(bt->left) 
     return Find_Min_Max(bt->left,&(*maxint),&(*minint)); 
    *minint = bt->data; 
    if(tmp->right) 
     return Find_Min_Max(tmp->right,&(*maxint),&(*minint)); 
    *maxint = tmp->data; 
} 

Но когда я использую его, чтобы дать мне только один результат макс/мин, я удалить эту часть кода, все работы отлично:

if(tmp->right) 
    return Find_Min_Max(tmp->right,&(*maxint),&(*minint)); 
*maxint = tmp->data; 

Любая идея, как это будет работать ?. Спасибо заранее.

+0

Не останавливается ли рекурсия, когда вы находите минимальное или максимальное значение? т. е. если min и max находятся в разных половинах, то он найдет только один из них. – shinzou

+0

Что такое 'tmp'? Разве вы не должны использовать 'bt-> right' вместо' tmp'? –

+0

@ FilipeGonçalves - это то же самое, что функция возвращает одно и то же значение для max и min – ZeroOne

ответ

0

Чтобы найти минимальное значение в BST, вы следуете цепочке левых детей из корня, пока не достигнете узла без левого дочернего элемента. Этот узел содержит минимальное значение (даже если у него есть правильный ребенок).

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

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

3

Это не очень просто/интуитивно понятно, чтобы рекурсивно вычислять max и min одновременно в одной и той же функции. Я бы даже сказал, что это невозможно, потому что это два совершенно разных пути.

У вас должна быть функция для получения минимума, функция для получения максимального значения и вызов каждого из них внутри Find_Min_Max.

Это будет возможный подход:

int find_min(node *n) { 
    if (n == NULL) { 
     return 0; 

    } 
    while (n->left != NULL) { 
     n = n->left; 
    } 
    return n->data; 
} 

find_max похож, но траверсы правильные ссылки только:

int find_max(node *n) { 
    if (n == NULL) { 
     return 0; 
    } 
    while (n->right != NULL) { 
     n = n->right; 
    } 
    return n->data; 
} 

Затем find_min_max() легко код:

void find_min_max(node *bt, int *min, int *right) { 
    *min = find_min(bt); 
    *max = find_max(bt); 
} 

find_min() и find_max() может быть рекурсивным, но итеративный подход имеет желательное свойство использования постоянной памяти (и, следовательно, позволяет избежать переполнения стека).

+0

Переход только влево или только вправо предполагает, что дерево сортируется в определенном порядке справа? – shinzou

+1

@kuhaku Предполагается, что мы говорим о BST, как и название. –

+0

Да, я знаю эти методы, а также мы можем использовать рекурсию в обеих функциях, но не существует способа слияния обеих функций рекурсии в одном! – ZeroOne

Смежные вопросы