思路:labuladong
96. 不同的二叉搜索树(简单)
题目:给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
* 输入:n = 3
* 输出:5
* 示例 2:
* 输入:n = 1
* 输出:1
思路:
可以使用递归的思想,选定i为根节点后,可能性就是count(low,i-1)*count(i+1,high)。那么遍历1-n,累加所有可能性即可
这里遍历时,会存在重复递归的问题,因此可以使用mem[n+1][n+1]记录count值
class Solution { public: int numTrees(int n) { mem=vector<vector<int>>(n+1,vector<int>(n+1,0)); return count(1,n); } int count(int lo, int hi){ if(lo>hi) return 1; if(mem[lo][hi]!=0) return mem[lo][hi]; int ret=0; for(int i=lo;i<=hi;++i){ int left=count(lo,i-1); int right=count(i+1,hi); ret+=left*right; } mem[lo][hi]=ret; return ret; } vector<vector<int>> mem; };
95. 不同的二叉搜索树II(中等)
题目:
给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
示例 1:
* 输入:n = 3
* 输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
* 示例 2:
* 输入:n = 1
* 输出:[[1]]
思路:
递归遍历所有可能性,当lo>hi时,只有null一种可能性,build(lo,hi)就返回了所有可能构建的根节点数组
所以遍历i=lo;i<=hi,然后得到build(lo,i-1)与build(i+1,hi)的数组后,遍历组合即可。
class Solution { public: vector<TreeNode*> generateTrees(int n) { if(n==0) return vector<TreeNode*>(); return build(1,n); } vector<TreeNode*> build(int lo,int hi){ vector<TreeNode*> ret; if(lo>hi){ ret.push_back(nullptr); return ret; } for(int i=lo;i<=hi;++i){ vector<TreeNode*> left=build(lo,i-1); vector<TreeNode*> right=build(i+1,hi); for(int j=0;j<left.size();++j){ for(int k=0;k<right.size();++k){ TreeNode* root=new TreeNode(i); root->left=left[j]; root->right=right[k]; ret.push_back(root); } } } return ret; } };