leetcode : Unique Binary Search Trees I&II
Given n, how many structurally unique BST's (binary search trees) that store values 1...n?
For example,
Given n = 3, there are a total of 5 unique BST's.
I是要求返回不同结构的树的数量,II要求把所有的可能的树构造出来,然后返回他们的根。
I:
对于n,可以分别选择他的第1,2,3, n个节点作为根节点,同时选取第i个节点时,左子树由0 - i -1 组成,右子树由i + 1 到n组成。
下面是AC代码:
class Solution { public: int numTrees(int n) { vector<int> dp(n + 1,0); dp[0] = 1; dp[1] = 1; for(int i = 2; i <= n; ++i){ int val = 0; for(int j = 1; j <= i; ++j){ val += dp[j - 1] * dp[i - j]; } dp[i] =val; } return dp[n]; } };
II:
II需要建立所有的子树,用深度搜索可以很好的解决问题,可以建立这样一个dfs函数:
它将从start 到 end的数字建立成树,并且返回所有的根节点。之后的思路与1是一样的,即分别选取第1,2,..n个节点为根,分别建立左右子树,由于结构一样但是value不同的树应该看成不同的树,所以在dfs函数中需要加上start与end参数
下面是AC代码:
class Solution { public: vector<TreeNode *> generateTrees(int n) { vector<TreeNode *> ret; ret = creatTrees(1,n); return ret; } vector<TreeNode *> creatTrees(int start, int end){ vector<TreeNode *> ret; if(start > end){ ret.push_back(NULL); return ret; } if(start == end){ ret.push_back(new TreeNode(start)); return ret; } else{ for(int i = start; i <= end; ++i){ vector<TreeNode *>left = creatTrees(start, i - 1); vector<TreeNode *>right = creatTrees(i + 1, end); for(int l = 0; l < left.size(); ++l) for(int r = 0; r < right.size(); ++r){ auto root = new TreeNode(i); root->left = left[l]; root->right = right[r]; ret.push_back(root); } } return ret; } } };
浙公网安备 33010602011771号