二叉搜索树(BST)
定义
左孩子的值全部小于根节点,右孩子的值全部大于跟结点,左孩子、右孩子同样满足上述条件。
假如有3个结点,总共有5个可能的BST:
1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2 3
问题一:给定结点的个数,计算BST的个数
分析
令f(0) = 1 f(1) = f(0)*f(0) f(2) = f(1)*f(0) + f(0)*f(1) f(3) = f(2)*f(0) + f(1)*f(1) + f(0)*f(2) …… f(n) = f(n-1)*f(0) + f(n-2)*f(1) +……f(0)*f(n-1)
参考代码
int numTrees(int n) { vector<int> vec; vec.push_back(1); for (int i = 1; i <= n; ++i) { int tmp = 0; for (int j = 0; j < i; ++j) tmp += vec[j] * vec[i-1-j]; vec.push_back(tmp); } return vec[n]; }
问题二:给定结点的个数,求出所有的BST
分析
递归实现,保存左孩子所有的组合、右孩子所有的组合,之后按着求个数的模式组合左右孩子。
参考代码
vector<TreeNode *> generateTrees(int n) { vector<TreeNode*> rev = generate(0, n-1); return rev; } vector<TreeNode *> generate(int beg, int end) { vector<TreeNode* > vec; if (beg > end) { vec.push_back(NULL); return vec; } for (int key = beg; key <= end; ++key) { vector<TreeNode*> leftTree = generate(beg, key-1); vector<TreeNode*> rightTree = generate(key+1, end); TreeNode *root = new TreeNode(key); for (int j = 0; j < leftTree.size(); ++j) { for (int k = 0; k < rightTree.size(); ++k) { TreeNode *root = new TreeNode(key); root->left = leftTree[j]; root->right = rightTree[k]; vec.push_back(root); } } } return vec; }
时间: 2024-10-03 21:53:33