vector<TreeNode*> generateTreesDFS(int start, int end) 
 {
      vector<TreeNode*> subTree;
      
      if (start>end)
      {
          subTree.push_back(NULL);
      }
      else
      {
          for (int i=start; i<=end; i++)
          {
             vector<TreeNode*> leftSubTree = generateTreesDFS(start, i - 1);
             vector<TreeNode*> rightSubTree = generateTreesDFS(i + 1, end);
          
         
             for (int j = 0; j < leftSubTree.size(); ++j) 
                 for (int k = 0; k < rightSubTree.size(); ++k) 
                 {
                     TreeNode *node = new TreeNode(i);
                     node->left = (leftSubTree)[j];
                     node->right = (rightSubTree)[k];
                     subTree.push_back(node);
                 }
         }             
      }
      
      return subTree;
 }
 vector<TreeNode*>* generateTreesDFS(int start, int end) {
 	vector<TreeNode*> *subTree = new vector<TreeNode*>();
 	if(start > end) {
 		subTree->push_back(NULL);
 	}else {
 		for(int i = start; i <= end; ++i) {
 			vector<TreeNode*> *leftSubTree = generateTreesDFS(start, i-1);
 			vector<TreeNode*> *rightSubTree = generateTreesDFS(i+1, end);
 			for(int j = 0; j < leftSubTree->size(); ++j) {
 				for(int k = 0; k < rightSubTree->size(); ++k) {
 					TreeNode *node = new TreeNode(i);
 					node->left = (*leftSubTree)[j];
 					node->right = (*rightSubTree)[k];
 					subTree->push_back(node);
 				}
 			}
 		}
 		
 	}
 	return subTree;
 }
 vector<TreeNode*> generateTrees(int n) {
     return *generateTreesDFS(1, n);
 }
 vector<TreeNode*> generateTrees(int n) 
 {
     if (n == 0) return {};
     return generateTreesDFS(1,n);
 }