Для того, чтобы найти наибольший элемент меньше, чем K в BST

голоса
17

Учитывая бинарное дерево поиска и целое число K, я хотел бы найти наибольший элемент меньше, чем К.

В приведенном ниже дереве,

for K = 13, result = 12
for K = 10, result = 8
for K = 1 (or) 2, result = -1

      10

  5       12

2   8   11  14

Я попытался ниже логику. Но есть ли лучший способ сделать это?

int findNum(node* node, int K)
{
        if(node == NULL)
        {
                return -1;
        }
        else if(K <= node->data)
        {
                return findNum(node->left,K);
        }
        else if(K > node->data)
        {
                int t = findNum(node->right,K);
                return t > node->data ? t : node->data;
        }

        return -1;
}
Задан 13/06/2011 в 19:22
источник пользователем
На других языках...                            


5 ответов

голоса
1

Я предлагаю вам пройти через код в локальной реализации набора :: UPPER_BOUND для руководства. Это не решение вашей конкретной проблемы, но очень близко.

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

Ответил 13/06/2011 в 19:29
источник пользователем

голоса
3

Я считаю , что при использовании стандартной библиотеки объектов. Таким образом, мое решение использует std::set. :-)

int largest_num_smaller_than(std::set<int> const& set, int num)
{
    std::set<int>::const_iterator lb(set.lower_bound(num));
    return lb == set.begin() ? -1 : *--lb;
}
Ответил 13/06/2011 в 19:33
источник пользователем

голоса
19

Это O (журнал N), что является минимальным. Тем не менее, вы можете повысить эффективность (который , как представляется, главное эти интервьюеры заботиться о) и исключить возможность переполнения стека (тада!), Устраняя хвостовую рекурсию, превращая это в петлю. Кроме того , ваш код не работает , если дерево содержит отрицательные числа ... если вы имеете в виду неотрицательные целые числа, вы должны сказать, но если интервьюер просто сказал , что «целые» , то вам необходимо немного другой код и другой API. (Вы можете сохранить ту же сигнатуру , но вернуться K вместо -1 при неудаче.)

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

Вот реализация:

// Return the greatest int < K in tree, or K if none.
int findNum (Node* tree, int K)
{
    int val = K;

    while( tree )
        if( tree->data >= K )
            tree = tree->left;
        else{
            val = tree->data; 
            tree = tree->right;
        }

    return val;
}
Ответил 13/06/2011 в 20:25
источник пользователем

голоса
5

Я думаю, что идея здесь заключается в записи последнего узла, после чего вы двигаетесь в правое поддерево. Таким образом, код будет (обновлено)

int findNum (Node *node, int K)
{
    Node* last_right_move = NULL;

    while (node)
    {
        if (K<=node->data)
            node = node->left;
        else
        {
            last_right_move = node;
            node = node->right;
        }
    }

    if (last_right_move)
        return last_right_move->data;
    else
        return NOT_FOUND;  // defined previously. (-1 may conflict with negative number)
}
Ответил 14/06/2011 в 03:06
источник пользователем

голоса
1

То, что первый ответ сказал, а вот логика, почему она не может быть лучше, чем O (журнал N). Вы ищете наибольшее число меньше, чем К. Это довольно близко к вызову BST-поиск / получить.

Хотя ваш оригинальный алгоритм выглядит довольно хорошо, я думаю, что это будет быстрее:

    int findNum (node root, int K) {
        if(root == null) return -1;

        if(K > root.val) { 
           if(root.right != null) return findNum(root.right, K);               
           else return root.val; 
        }

        return findNum(root.left, K); //look in left subtree

    }
Ответил 27/07/2011 в 11:11
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more