2016-03-29 3 views
-3

今日私はインタビューでこれを正しく実行したかどうか疑問に思っています。セットアップは今日インタビューで尋ねられました:バイナリツリー内の2つの要素の最も近い子孫を見つけよう

Node ClosestDescendent (Node root, Node left, Node right) 
{ 
    // ... 
} 

class Node 
{ 
    int val; 
    Node left; 
    Node right; 
} 

です。

 5 
    /\ 
    4 6 
/\ \ 
2 3 7 

val S 27leftrightノードのClosestDesendantvalため5であろう、そしてval S 234をあろうとleftrightノードのClosestDesendantval

私の実装では、私は

  • 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; 
    } 
    

    、これが正しいと思ったんだけどでしたか?

  • このSkeet認定はありますか?
  • もっと良い解決策はありますか?
+1

とあなたの質問脇けど...あなたは、[ヒラリークリントン](http://stackoverflow.com/users/6048670/hillary-クリントン)、[this]を知っている(http://meta.stackoverflow.com/questions/319809/what-is-the-policy-on-user-names-that-are-obvious-impersonators-of-actual-person )メタポスト? – Ian

+1

が解決しているかどうかを確認しなくても、良い変数名とよく似たメソッドを使用して、自分のコードに約50%のコメントがあることに非常に関心があります。私はコードが「非常に不可欠」であり、私は個人的にはこのような問題に対するより機能的なアプローチを好みたいと考えていますが、私は部分的には、あなたが、テールコールの最適化があります。 – kai

+0

'codenode = cornode.left;'これらのシンボルのどれも範囲内にはありません、あなたは 'curnode'のスペルを間違えたと思いますか? – kai

答えて

1

いくつかの擬似コード:オフトピック

// 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); 
    }  
} 
関連する問題