95. 不同的二叉搜索树 II
C++。思路如下:
对于连续整数序列[left, right]中的一点i,若要生成以i为根节点的BST,则有如下规律:
i左边的序列可以作为左子树结点,且左儿子可能有多个,所以有vector<TreeNode *> left_nodes = generate(left, i - 1);;
i右边的序列可以作为右子树结点,同上所以有vector<TreeNode *> right_nodes = generate(i + 1, right);;
产生的以当前i为根结点的BST(子)树有left_nodes.size() * right_nodes.size()个,遍历每种情况,即可生成以i为根节点的BST序列;
然后以for循环使得[left, right]中每个结点都能生成子树序列。
即如下代码:
for (int i = left; i <= right; i++) {
vector<TreeNode *> left_nodes = generate(left, i - 1);
vector<TreeNode *> right_nodes = generate(i + 1, right);
for (TreeNode *left_node : left_nodes) {
for (TreeNode *right_node : right_nodes) {
TreeNode *t = new TreeNode(i);
t->left = left_node;
t->right = right_node;
ans.push_back(t);
}
}
}
一旦left大于right,则说明这里无法产生子树,所以此处应该是作为空结点返回:ans.push_back(NULL); return ans;;
返回[left, right]中生成的所有子树序列ans。
1 class Solution 2 { 3 public: 4 vector<TreeNode *> generateTrees(int n) 5 { 6 if (n) return generate(1, n); 7 else return vector<TreeNode *>{}; 8 } 9 10 vector<TreeNode *> generate(int left, int right) 11 { 12 vector<TreeNode *> ans; 13 if (left > right) 14 { 15 ans.push_back(NULL); 16 return ans; 17 } 18 for (int i = left; i <= right; i++) 19 { 20 vector<TreeNode *> left_nodes = generate(left, i - 1); 21 vector<TreeNode *> right_nodes = generate(i + 1, right); 22 for (TreeNode *left_node : left_nodes) 23 { 24 for (TreeNode *right_node : right_nodes) 25 { 26 TreeNode *t = new TreeNode(i); 27 t->left = left_node; 28 t->right = right_node; 29 ans.push_back(t); 30 } 31 } 32 } 33 return ans; 34 } 35 };
Mamba never out

浙公网安备 33010602011771号