Advertisement
nikunjsoni

95

Jun 21st, 2021
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. /**
  2.  * Definition for a binary tree node.
  3.  * struct TreeNode {
  4.  *     int val;
  5.  *     TreeNode *left;
  6.  *     TreeNode *right;
  7.  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8.  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9.  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10.  * };
  11.  */
  12. class Solution {
  13. public:
  14.     vector<TreeNode*> generateTrees(int n) {
  15.         return generate(1, n);
  16.     }
  17.    
  18.     vector<TreeNode*> generate(int left, int right){
  19.         vector<TreeNode*> ans;
  20.         // Condition of child of leaf node.
  21.         if(left > right){
  22.             ans.push_back(NULL);
  23.             return ans;
  24.         }
  25.        
  26.         // Consider each point as root and recursively generate trees.
  27.         for(int i=left; i<=right; i++){
  28.             auto leftTrees = generate(left, i-1);
  29.             auto rightTrees = generate(i+1, right);
  30.             for(auto l: leftTrees){
  31.                 for(auto r: rightTrees){
  32.                     TreeNode *node = new TreeNode(i);
  33.                     node->left = l;
  34.                     node->right = r;
  35.                     ans.push_back(node);
  36.                 }
  37.             }
  38.         }
  39.         return ans;
  40.     }  
  41. };
  42.  
  43. ---------------------------
  44.  
  45. class Solution {
  46. public:
  47.   map <pair<int, int>, vector<TreeNode*>> cache;
  48.   vector<TreeNode*> generateTreesR(int start, int end) {
  49.     if (cache.find({start, end}) != cache.end())
  50.       return cache[{start, end}];
  51.    
  52.     vector<TreeNode*> res;
  53.     if (start > end) {
  54.       res.push_back(NULL);
  55.       cache[{start, end}] = res;
  56.       return res;
  57.     }
  58.  
  59.     if (start == end) {
  60.       TreeNode* head = new TreeNode(start);
  61.       res.push_back(head);
  62.       cache[{start, end}] = res;
  63.       return res;
  64.     }
  65.    
  66.     for (int i=start; i<=end; i++) {
  67.       // Make ith as root node.
  68.       vector<TreeNode*> res_left = generateTreesR(start, i-1);
  69.       vector<TreeNode*> res_right = generateTreesR(i+1, end);
  70.       for (auto left_tree: res_left) {
  71.         for (auto right_tree: res_right) {
  72.           TreeNode* head = new TreeNode(i);
  73.           head->left = left_tree;
  74.           head->right = right_tree;
  75.           res.push_back(head);
  76.         }
  77.       }
  78.     }
  79.    
  80.     cache[{start, end}] = res;
  81.     return res;
  82.   }
  83.  
  84.   vector<TreeNode*> generateTrees(int n) {
  85.     return generateTreesR(1, n);
  86.   }
  87. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement