Commit 457144f

mo <mokha@cisco.com>
2017-08-08 21:15:04
use ruby Enumerator. time O(k), space O(1)
1 parent 9b30766
Changed files (1)
spec/binary_trees/kth_largest_in_bst_spec.rb
@@ -153,6 +153,18 @@ describe "#kth_largest_in_bst" do
     Traversal.new(k).traverse(tree)
   end
 
+  def dfs(node, yielder)
+    return if node.nil?
+
+    dfs(node.left, yielder)
+    yielder.yield node.value
+    dfs(node.right, yielder)
+  end
+
+  def kth_largest_in_bst(tree, k)
+    Enumerator.new { |yielder| dfs(tree, yielder) }.take(k).last
+  end
+
   [
     { t: { "value": 3, "left": { "value": 1, "left": nil, "right": nil }, "right": { "value": 5, "left": { "value": 4, "left": nil, "right": nil }, "right": { "value": 6, "left": nil, "right": nil } } }, k: 2, x: 3 },
     { t: { "value": 1, "left": { "value": -1, "left": { "value": -2, "left": nil, "right": nil }, "right": { "value": 0, "left": nil, "right": nil } }, "right": nil }, k: 1, x: -2 },