master
  1<<-DOC
  2Note: Your solution should have O(inorder.length) complexity, since this is what you will be asked to accomplish in an interview.
  3
  4Let's define inorder and preorder traversals of a binary tree as follows:
  5
  6Inorder traversal first visits the left subtree, then the root, then its right subtree;
  7Preorder traversal first visits the root, then its left subtree, then its right subtree.
  8For example, if tree looks like this:
  9
 10    1
 11   / \
 12  2   3
 13 /   / \
 144   5   6
 15then the traversals will be as follows:
 16
 17Inorder traversal: [4, 2, 1, 5, 3, 6]
 18Preorder traversal: [1, 2, 4, 3, 5, 6]
 19Given the inorder and preorder traversals of a binary tree t, but not t itself, restore t and return it.
 20
 21Example
 22
 23For inorder = [4, 2, 1, 5, 3, 6] and preorder = [1, 2, 4, 3, 5, 6], the output should be
 24restoreBinaryTree(inorder, preorder) = {
 25    "value": 1,
 26    "left": {
 27        "value": 2,
 28        "left": {
 29            "value": 4,
 30            "left": null,
 31            "right": null
 32        },
 33        "right": null
 34    },
 35    "right": {
 36        "value": 3,
 37        "left": {
 38            "value": 5,
 39            "left": null,
 40            "right": null
 41        },
 42        "right": {
 43            "value": 6,
 44            "left": null,
 45            "right": null
 46        }
 47    }
 48}
 49For inorder = [2, 5] and preorder = [5, 2], the output should be
 50restoreBinaryTree(inorder, preorder) = {
 51    "value": 5,
 52    "left": {
 53        "value": 2,
 54        "left": null,
 55        "right": null
 56    },
 57    "right": null
 58}
 59Input/Output
 60
 61[time limit] 4000ms (rb)
 62[input] array.integer inorder
 63
 64An inorder traversal of the tree. It is guaranteed that all numbers in the tree are pairwise distinct.
 65
 66Guaranteed constraints:
 671  inorder.length  2 · 103,
 68-105  inorder[i]  105.
 69
 70[input] array.integer preorder
 71
 72A preorder traversal of the tree.
 73
 74Guaranteed constraints:
 75preorder.length = inorder.length,
 76-105  preorder[i]  105.
 77
 78[output] tree.integer
 79
 80The restored binary tree.
 81http://www.geeksforgeeks.org/construct-tree-from-given-inorder-and-preorder-traversal/
 82DOC
 83
 84describe "#restore_binary_tree" do
 85  def restore_binary_tree(inorder, preorder)
 86    return nil if inorder.empty?
 87
 88    value = preorder.shift
 89    pivot = inorder.index(value)
 90    {
 91      value: value,
 92      left: pivot.zero? ? nil : restore_binary_tree(inorder[0..(pivot-1)], preorder[0..pivot]),
 93      right: restore_binary_tree(inorder[pivot+1..-1], preorder[pivot..-1])
 94    }
 95  end
 96
 97  null = nil
 98  [
 99    { inorder: [4, 2, 1, 5, 3, 6], preorder: [1, 2, 4, 3, 5, 6], x: { "value": 1, "left": { "value": 2, "left": { "value": 4, "left": null, "right": null }, "right": null }, "right": { "value": 3, "left": { "value": 5, "left": null, "right": null }, "right": { "value": 6, "left": null, "right": null } } } },
100    { inorder: [2, 5], preorder: [5, 2], x: { "value": 5, "left": { "value": 2, "left": null, "right": null }, "right": null } },
101    { inorder: [100], preorder: [100], x: { "value": 100, "left": null, "right": null } },
102    { inorder: [-100000, -99999, -99998], preorder: [-99999, -100000, -99998], x: { "value": -99999, "left": { "value": -100000, "left": null, "right": null }, "right": { "value": -99998, "left": null, "right": null } } },
103  ].each do |x|
104    it do
105      $preorder_index = 0
106      expect(restore_binary_tree(x[:inorder], x[:preorder])).to eql(x[:x])
107    end
108  end
109end