LeetCode_Unique Binary Search Trees II
来源:互联网 发布:涤纶低弹网络丝应香莲 编辑:程序博客网 时间:2024/06/07 23:37
一.题目
Unique Binary Search Trees II
Total Accepted: 32757 Total Submissions: 117071My SubmissionsGiven n, generate all structurally unique BST's (binary search trees) that store values 1...n.
For example,
Given n = 3, your program should return all 5 unique BST's shown below.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
Show Tags
Have you met this question in a real interview?
Yes
No
Discuss
二.解题技巧
这道题和Unique Binary Search Trees很相似,只是这道题可能无法使用动态规划减少计算的时间,因为每一个节点的值是不一样的,不存在相同的子问题的情况,因此,计算复杂度无法下降。使用递归的方式进行的时候,时间复杂度为O(n^3),空间复杂度为O(n)。
三.实现代码
#include <iostream>#include <vector>#include <unordered_map>using std::vector;using std::unordered_map;/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};class Solution{private: unordered_map<int, vector<TreeNode*> > PreResult; vector<TreeNode*> generateTrees(int n, int base) { vector<TreeNode*> Result; if (n == 0) { TreeNode* TmpNode = NULL; Result.push_back(TmpNode); return Result; } if (n == 1) { TreeNode* TmpNode = new TreeNode(n + base); Result.push_back(TmpNode); return Result; } for (int HeadIndex = 1; HeadIndex <= n; HeadIndex++) { vector<TreeNode*> LeftChildVector = generateTrees(HeadIndex - 1, base); vector<TreeNode*> RightChildVector = generateTrees(n - HeadIndex, base + HeadIndex); const vector<TreeNode*>::size_type LEFTSIZE = LeftChildVector.size(); const vector<TreeNode*>::size_type RIGHTSIZE = RightChildVector.size(); for (vector<TreeNode*>::size_type IndexOfLeft = 0; IndexOfLeft < LEFTSIZE; IndexOfLeft++) { for (vector<TreeNode*>::size_type IndexOfRight = 0; IndexOfRight < RIGHTSIZE; IndexOfRight++) { TreeNode *TmpHeadNode = new TreeNode(base + HeadIndex); TmpHeadNode->left = LeftChildVector[IndexOfLeft]; TmpHeadNode->right = RightChildVector[IndexOfRight]; Result.push_back(TmpHeadNode); } } } return Result; }public: vector<TreeNode*> generateTrees(int n) { return generateTrees(n, 0); }};
四.体会
这道题也是一个和Unique Binary Search Trees类似的问题,解题思路也比较类似,只是这个的返回是所有可能的二叉查找树,主要解答过程只是稍微修改下即可。
版权所有,欢迎转载,转载请注明出处,谢谢
0 0
- Leetcode_unique-binary-search-trees-ii
- LeetCode_Unique Binary Search Trees II
- leetCode_Unique Binary Search Trees II
- Leetcode_unique-binary-search-trees
- LeetCode_Unique Binary Search Trees
- leetcode_Unique Binary Search Trees_easy
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees (& II)
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- 欢迎使用CSDN-markdown编辑器
- Valid Parentheses
- 如何在表面着色器中使用顶点函数
- Oracle 序列 每天 重建
- [日志处理工作之二]使用flume-ng解析db2日志的初步步骤
- LeetCode_Unique Binary Search Trees II
- linux中查找,which和whereis
- XP获取SSDT表
- 《零基础学Python(第二版)》(一)
- Delphi excel 复制粘贴到dbgrid
- 脑图篇
- gcc常用编译过程
- ConcurrentHashMap原理分析
- 使用websocket发送图片文件