题目大意:给定一个数n表示二叉树的节点数,求这么多个节点能够表示的所有二叉树
解题思路:先求出这些二叉树的结构,再用中序遍历去给这些二叉树节点赋值
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<TreeNode *> generateTrees(int n) {
if(n <= 0) {
return vector<TreeNode *>(1, NULL);
}
vector<vector<TreeNode *> > dp(n + 1, vector<TreeNode *>());
dp[0].push_back(NULL);
dp[1].push_back(new TreeNode(0));
for(int i = 2; i <= n; i++) {
for(int low = 0, high = i - 1; low <= i - 1 && high >= 0; low++, high--) {
for(vector<TreeNode *>::iterator low_iter = dp[low].begin(); low_iter != dp[low].end(); low_iter++) {
for(vector<TreeNode *>::iterator high_iter = dp[high].begin(); high_iter != dp[high].end(); high_iter++) {
TreeNode *tmp = new TreeNode(0);
tmp->left = *low_iter;
tmp->right = *high_iter;
dp[i].push_back(tmp);
}
}
}
}
vector<TreeNode *> result;
for(vector<TreeNode *>::iterator iter = dp[n].begin(); iter != dp[n].end(); iter++) {
TreeNode *root = new TreeNode(0);
inorderTravelCopy(*iter, root);
result.push_back(root);
}
return result;
}
private:
void inorderTravelCopy(TreeNode *root, TreeNode *copyRoot) {
if(root == NULL || copyRoot == NULL) {
return;
}
TreeNode *cur = root;
TreeNode *curCopy = copyRoot;
int val = 1;
stack<TreeNode *> vstack;
stack<TreeNode *> copyStack;
do {
while(cur != NULL) {
vstack.push(cur);
copyStack.push(curCopy);
cur = cur->left;
if(cur != NULL) {
curCopy->left = new TreeNode(0);
curCopy = curCopy->left;
}
}
TreeNode *tmp = vstack.top();
TreeNode *copyTmp = copyStack.top();
vstack.pop();
copyStack.pop();
copyTmp->val = val++;
cur = tmp->right;
if(cur != NULL) {
copyTmp->right = new TreeNode(0);
curCopy = copyTmp->right;
}
} while(!vstack.empty() || cur != NULL);
}
};