def construct_tree(d):
     items = []
     for idx in d:
         x = X[self.index_map == idx]
         y = Y[self.index_map == idx]
         z = Z[self.index_map == idx]
         f = self.data[self.index_map == idx]
         if type(d[idx]) == tuple:
             sub_items = construct_tree(d[idx][0])
             b = Branch(sub_items, x[0], y[0], z[0], f[0], id=idx)
             for i in range(1, len(x)):
                 b.add_point(x[i], y[i], z[i], f[i])
             items.append(b)
         else:
             l = Leaf(x[0], y[0], z[0], f[0], id=idx)
             for i in range(1, len(x)):
                 l.add_point(x[i], y[i], z[i], f[i])
             items.append(l)
     return items