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