题目分析:
- 对于给定的数n,n表示二叉树的节点总数,求n个节点能够表示的所有二叉树。
解题思路:
递归求解
对于所有可能的二叉树,二叉树的数目为卡特兰数,不是一个多项式时间的数量级,求解的所有树,而显示时间内不能完成。其求解方法采用递归。
实现程序
vector<TreeNode *> createTree(int start, int end) { vector<TreeNode *> results; // 返回一棵树 if (start > end) { results.push_back(NULL); return results; } // 创建节点 for (int k = start; k <= end; k++) { // 递归创建左子树 vector<TreeNode *> left = createTree(start, k - 1); // 递归创建右子树 vector<TreeNode *> right = createTree(k + 1, end); for (int i = 0; i < left.size(); i++) { for (int j = 0; j < right.size(); j++) { TreeNode *root = new TreeNode(k); root->left = left[i]; root->right = right[j]; results.push_back(root); } } } // 返回所有树 return results; } vector<TreeNode *> generateTrees(int n) { vector<TreeNode *> result; if (n == 0) return result; // 递归创建每一棵子树 result = createTree(1, n); return result; }