问题:
给定1~n个节点,(根据1~n构成<前序,中序,后序,其中一种>遍历序列,求可构成的二叉树种类)
令这些节点构成二叉树,求所能构成的所有(不重复)二叉树。
Example 1: Input: n = 3 Output: [[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]] Example 2: Input: n = 1 Output: [[1]] Constraints: 1 <= n <= 8
example 1:
解法:Binary Tree(二叉树)DFS(深度优先搜索)
思路:对于所有可选节点start->end
我们可以取其中任意节点作为root :(start...end)
则将其分为左右两树:
左子树left:start->root-1
右子树right:root+1->end
递归去求取可能构成的所有树
再遍历所有左子树(任意l属于left),右子树(任意r属于right),
+root
构成当前层的树。
每一种构成即为一个解。
代码参考:
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*> genTree(int start, int end) { 15 //cout<<"start: "<<start<<" end: "<<end<<endl; 16 vector<TreeNode*> res; 17 if(start>end) { 18 res.push_back(nullptr); 19 return res; 20 } 21 if(start==end) { 22 res.push_back(new TreeNode(start)); 23 //cout<<res.size()<<endl; 24 return res; 25 } 26 for(int root=start; root<=end; root++) { 27 vector<TreeNode*> left = genTree(start, root-1); 28 vector<TreeNode*> right = genTree(root+1, end); 29 for(TreeNode* l:left) { 30 for(TreeNode* r:right) { 31 res.push_back(new TreeNode(root, l, r)); 32 // 33 } 34 } 35 } 36 return res; 37 } 38 vector<TreeNode*> generateTrees(int n) { 39 return genTree(1,n); 40 } 41 };