2016-03-29 22 views
-3

Sadece bugün mülakatta bunu doğru yapıp yapmadığımı merak ediyorum. Kurulum,Bir röportajda bugün sordu: Bir ikili ağaçtaki iki elementin en yakın torununu bulun

örn.

 5 
    /\ 
    4 6 
/\ \ 
2 3 7 

val s 2 ve 7 ile left ve right düğüm ClosestDesendant arasında val için 5 olacaktır ve val s 2 ve 34 olur ile left ve right düğüm ClosestDesendant arasında val .

Benim uygulanması ben

  • Node ClosestDescendent (Node root, Node left, Node right) 
    { 
        // assume left != right and both left and right are 
        // nodes in the tree 
    
        // figuring out which is the smaller and which is the bigger 
        // simplifies logic later 
        Node smaller, bigger; 
        if (left.val < right.val) { smaller = left; bigger = right; } 
        else { smaller = right; bigger = left; } 
        // traverse tree towards both left and right 
        // until the path diverges 
        Node curnode = root; 
        while (true) 
        { 
         if (curnode.val < smaller.val && curnode.val < bigger.val) 
         { 
          curnode = curnode.right; 
         } 
         else if (curnode.val > smaller.val && curnode.val > bigger.val) 
         { 
          codenode = cornode.left; 
         } 
         else // curnode.val >= smaller.val && curnode.val <= biger.val 
         { 
          break; 
         } 
        } 
        return curnode; 
    } 
    

    ve bu doğru mi merak ediyorum edildi?

  • Bu Skeet sertifikalı mı?
  • Daha iyi bir çözüm nedir?
+1

konu dışı ve soru kenara ama ... sen, [Hillary Clinton,] (http://stackoverflow.com/users/6048670/hillary- clinton), bunun farkında [http://meta.stackoverflow.com/questions/319809/what-is-the-policy-on-user-names-that-are-obvious-impersonators-of-actual-person) meta gönderimi? – Ian

+1

, çözümün işe yarayıp yaramadığını doğrulamaksızın, sizin için iyi değişken isimlere ve iyi-çarpanlı yöntemlere güvenmek yerine, kodunuzda yaklaşık% 50 yorumunuzun olması gerçeğiyle çok ilgileneceğim. Ayrıca, kodun “çok zorlayıcı” olduğunu ve kişisel olarak bu gibi bir soruna daha işlevsel bir yaklaşımı tercih ettiğimi de belirtmek isterim, ama sanırım kısmen kısır bir zorunluluk dilini kullanıyorsunuz. kuyruk arama optimizasyonu var. – kai

+0

'codenode = cornode.left;' Bu simgelerin hiçbiri kapsam dahilinde değil, yalnızca 'curnode' kelimesini yanlış yazdığınızı var sayıyorum. – kai

cevap

1

Bazı sözde kod:

// TODO: Null check, equality handling. 
Node ClosestDescendent(Node root, Node left, Node right) { 

    const int root_val = root->val; 
    const int left_val = left->val; 
    const int right_val = right->val; 

    // left and right diverges two ways 
    if ((left_val < root_val) && (right_val > root_val)) { 
    return root; 
    } 

    // left and right both are to the left 
    else if ((left_val < root_val) && (right_val < root_val)) { 
    return ClosestDescendent(root->left, left, right); 
    } 

    // left and right both are to the right 
    else ((left_val > root_val) && (right_val > root_val) { 
    return ClosestDescendent(root->right, left, right); 
    }  
}