Классный c Алгоритм двоичного поиска. Я всегда рекомендую вам разобраться в проблеме, которую вы разместили. Если вы разберетесь с алгоритмом, вы узнаете, как на самом деле работает двоичный поиск, а также как работает Backtrack с использованием StackTrace в вашей системе / памяти компьютера.
Давайте погрузимся в это. :)
if(!root){
return NULL;
}
приведенный выше фрагмент кода, если вы дойдете сюда, гарантируется, что вы просмотрели все возможности, но не нашли нужный вам «ключ». : (
if( !(floorValue(root->left , prev ,k))
{
return NULL;
}
Помните, что вы должны возвращать NULL вместо возврата 0, поскольку возвращаемое значение вашей функции на самом деле NULL (хотя оба значения 0 / NULL определяют ложный случай в c / c ++, вы преждевременно вы можете использовать любой из них.
Теперь вы можете видеть, что вы погружаетесь в функцию, с root -> left, означает, что левая часть дерева проверяется первой, подобно двоичному поиску, где вы находитесь поиск в левой части элементов ввода.
if(root->data == k)
{
return root;
}
Если вы дойдете сюда, поздравляю, вы наконец достигли пункта назначения: D, другими словами, вы нашли свой результат в огромных (или маленьких, любых) элементах ввода .
if(root->data > k)
{
return prev;
}
Приведенный выше фрагмент будет таким же, когда ваши средние элементы больше, чем ваш ключ, поэтому вы знаете, что вам нужно go левую сторону ваших входов. (Движение вправо всегда вызывает у вас печаль, вы закончится ничем).
prev = root;
return floorValue(root->right , prev , k);
Приведенный выше код говорит вам, что вы пошли влево, но получили 0 (в итоге вы не смогли найти результат), поэтому вам нужно go вправо сторона сейчас.
Теперь самое главное, поймите эти два следующих фрагмента:
if(root->data > k)
{
return prev;
}
и
prev = root;
return floorValue(root->right , prev , k);
Два приведенных выше фрагмента не только погружают вас в левую или правую часть вашего дерево (или входы), но также проверяет каждый левый и правый узел вашего левого Дерева, а также правый и левый узел вашего правого Дерева.
Когда ему не удалось получить нужный ключ, он возвращается на ваше место где вы начали go в LEFT (это своего рода ТЕМНАЯ серия, давайте предположим, что left - ПРОШЛОЕ здесь,: D right ?? ) теперь вам нужно go to future, это ПРАВИЛЬНО, чтобы узнать ключ.
вы получили ключ? верните его слева (прошлое) или go снова направо (будущее).
вы обязательно придете к выводу, либо УСПЕХ, либо НЕУДАЧА.
наслаждайтесь.