leetcode第一刷_Unique Binary Search Trees II
2014-05-09 10:10
381 查看
可能没想到简单方法的人,在上一题中就把这一题给做了。怎样把所有的树都生成出来呢?方法肯定用的是递归,但是有个致命的问题,如果做好了根节点再递归,那么出来的很多树都公用一个根节点,结果肯定是乱七八糟的。
怎么做?其实做法跟之前求个数在思想上是高度统一的,先把所有的左右子树都求出来,然后把它们之间的所有组合都连接到一个新建立出来的根节点,既然是分开左右子树,很容易想到类似二分的思想,每次指定的不是一个位置,而是一个范围。我一开始还想着先把n个数放到数组里面再递归,脱了裤子放屁啊。
通过对算法思想的描述,“先确定左右子树,再添加根节点”,很容易想到使用类似后序遍历的编码格式。
怎么做?其实做法跟之前求个数在思想上是高度统一的,先把所有的左右子树都求出来,然后把它们之间的所有组合都连接到一个新建立出来的根节点,既然是分开左右子树,很容易想到类似二分的思想,每次指定的不是一个位置,而是一个范围。我一开始还想着先把n个数放到数组里面再递归,脱了裤子放屁啊。
通过对算法思想的描述,“先确定左右子树,再添加根节点”,很容易想到使用类似后序遍历的编码格式。
class Solution { public: vector<TreeNode *> buildTrees(int beg, int end){ vector<TreeNode *> res, left, right; if(beg>end){ res.push_back(NULL); return res; } for(int i=beg;i<=end;i++){ left = buildTrees(beg, i-1); right = buildTrees(i+1, end); for(int j=0;j<left.size();j++){ for(int k=0;k<right.size();k++){ TreeNode *root = new TreeNode(i+1); root->left = left[j]; root->right = right[k]; res.push_back(root); } } } return res; } vector<TreeNode *> generateTrees(int n) { return buildTrees(0, n-1); } };
相关文章推荐
- 【leetcode】Unique Binary Search Trees II
- LeetCode | Unique Binary Search Trees II
- LeetCode Unique Binary Search Trees II
- LeetCode Unique Binary Search Trees II
- LeetCode之Unique Binary Search Trees II
- [leetcode] 95. Unique Binary Search Trees II
- LeetCode Unique Binary Search Trees II
- LeetCode Unique Binary Search Trees II
- LeetCode 95:Unique Binary Search Trees II
- Leetcode 95. Unique Binary Search Trees II及二叉树最大最小深度镜像树总结
- LeetCode: Unique Binary Search Trees II
- LeetCode Online Judge 题目C# 练习 - Unique Binary Search Trees II
- LeetCode(95) Unique Binary Search Trees II
- LeetCode - Unique Binary Search Trees II
- 《leetCode》:Unique Binary Search Trees II
- [LeetCode]Unique Binary Search Trees II
- [Leetcode]Unique Binary Search Trees I & II
- [leetcode刷题系列]Unique Binary Search Trees II
- [LeetCode] Unique Binary Search Trees II
- [leetcode] Unique Binary Search Trees II