Medium!
題目描述:
給定一個整數 n,生成所有由 1 ... n 為節點所組成的二叉搜索樹。
示例:
輸入: 3 輸出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解釋: 以上的輸出對應以下 5 種不同結構的二叉搜索樹: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
解題思路:
這種建樹問題一般來說都是用遞歸來解,這道題也不例外,划分左右子樹,遞歸構造。至於遞歸函數中為啥都用的是指針,是參考了http://fisherlei.blogspot.com/2013/03/leetcode-unique-binary-search-trees-ii.html,若不用指針,全部實例化的話會存在大量的對象拷貝,要調用拷貝構造函數,具體我尚且不太懂,感覺挺言之有理,不明覺厲。
C++解法一:
1 class Solution { 2 public: 3 vector<TreeNode *> generateTrees(int n) { 4 if (n == 0) return {}; 5 return *generateTreesDFS(1, n); 6 } 7 vector<TreeNode*> *generateTreesDFS(int start, int end) { 8 vector<TreeNode*> *subTree = new vector<TreeNode*>(); 9 if (start > end) subTree->push_back(NULL); 10 else { 11 for (int i = start; i <= end; ++i) { 12 vector<TreeNode*> *leftSubTree = generateTreesDFS(start, i - 1); 13 vector<TreeNode*> *rightSubTree = generateTreesDFS(i + 1, end); 14 for (int j = 0; j < leftSubTree->size(); ++j) { 15 for (int k = 0; k < rightSubTree->size(); ++k) { 16 TreeNode *node = new TreeNode(i); 17 node->left = (*leftSubTree)[j]; 18 node->right = (*rightSubTree)[k]; 19 subTree->push_back(node); 20 } 21 } 22 } 23 } 24 return subTree; 25 } 26 };