Node ReconstructTreeHelper(SubArray<int> preorder, SubArray<int> inorder,
 Dictionary<int, int> inorderMapTable)
   {
       int rootVal = preorder[0];
         int rootPos = inorderMapTable[rootVal] - inorder.Offset;
         Node node = new Node { Id = rootVal };
         int nodesToLeft = rootPos;
         if (nodesToLeft > 0)
       node.Left = ReconstructTreeHelper(preorder.SubArray(1, nodesToLeft),
         inorder.SubArray(0, nodesToLeft), inorderMapTable);
         int nodesToRight = inorder.Count - rootPos - 1;
         if (nodesToRight > 0)
       node.Right = ReconstructTreeHelper(preorder.SubArray(rootPos + 1, nodesToRight),
         inorder.SubArray(rootPos + 1, nodesToRight), inorderMapTable);
         return node;
   }