Chcete-li najít největší prvek menší než K v BST

hlasů
17

Vzhledem k tomu, binární vyhledávací strom a celé číslo K, rád bych najít největší prvek menší než K.

V dole stromu,

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

      10

  5       12

2   8   11  14

Snažil jsem se pod logiku. Ale existuje nějaký lepší způsob, jak to udělat?

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;
}
Položena 13/06/2011 v 19:22
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
1

Domnívám se, že budete procházet kód v místní implementaci sady :: UPPER_BOUND orientační. To není řešením přesně problém, ale velmi blízko.

Obecně platí v reálném životě, většina z těchto problémů nemusí být řešeny ve vlastním kódu. STL lze provést mnoho běžných úkolů pro vás. Je užitečné vědět, jak je řešit samozřejmě, proto test.

Odpovězeno 13/06/2011 v 19:29
zdroj uživatelem

hlasů
3

Věřím, že za použití standardních knihovních zařízení. Takže moje řešení používá 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;
}
Odpovězeno 13/06/2011 v 19:33
zdroj uživatelem

hlasů
19

To je O (log n), což je minimální. Nicméně, můžete zvýšit efektivitu (což se zdá být to hlavní, co tito tazatelé záleží) a vyloučit možnost přetečení zásobníku (tada!) Tím, že odstraňuje ocas rekurzi, obrátil to do smyčky. Také váš kód nefunguje v případě, že strom obsahuje záporná čísla ... pokud máte na mysli nezáporné celá čísla, měli byste se to tak říct, ale v případě, že tazatel právě řekl „celá“, pak je třeba trochu jiný kód a jiný API. (Dalo by se držet stejnou funkci podpis, ale vrátit K namísto -1 při výpadku).

BTW, protože se jedná o rozhovor otázkou, kterou se provádí prostřednictvím volání funkce knihovny by se říct, většina tazatelů, že jste chytrák, nebo jsou mimo mísu, nebo nevědí, jak to vyřešit. Nehrajte si s takovými věcmi, jen dostat se pracuje na tom, co víte, že tazatel chce.

Zde je implementace:

// 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;
}
Odpovězeno 13/06/2011 v 20:25
zdroj uživatelem

hlasů
5

Myslím, že myšlenka tady je zaznamenat poslední uzel, po kterém se pohybujete do pravého podstromu. Proto tento kód, bude (bylo aktualizováno)

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)
}
Odpovězeno 14/06/2011 v 03:06
zdroj uživatelem

hlasů
1

To, co řekl, že první odpověď, a tady je logika, proč nemůže dostat lepší, než O (log n). Hledáte pro největší číslo menší než K. To je docela blízko k volání BST-search / dostat.

Ačkoli původní algoritmus vypadá docela dobře, myslím, že by to bylo rychlejší:

    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

    }
Odpovězeno 27/07/2011 v 11:11
zdroj uživatelem

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