Unique Binary Search Trees II
来源:互联网 发布:日本女留学生刘鑫 知乎 编辑:程序博客网 时间:2024/04/30 05:06
Given 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.
起初脑残不知道怎么想的。。。思路根本就有问题
最终思路:
递归,给定n,分别以从1到n为根,然后枚举出左子树(m个)和右子树(n个),然后合并成一棵树(m*n个)
注意,在将树保存到vector的时候,需要注意,根不要重用,这样会修改掉vector中前面的树的信息,根要每次都new出来。
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<TreeNode *> generateTrees(int n) { vector<TreeNode*> vv; if(n<1){ vv.push_back(NULL); return vv; } return build(1,n); } vector<TreeNode*> build(int start,int end){ vector<TreeNode*> vv; if(start>end){ return vv; }else if(start==end){ vv.push_back(new TreeNode(start)); }else{ for(int i=start;i<=end;i++){ TreeNode* node = new TreeNode(i); vector<TreeNode*> vl = build(start,i-1); vector<TreeNode*> vr = build(i+1,end); if(vl.size()==0){ for(int j=0;j<vr.size();j++){ node = new TreeNode(i); node->right = vr[j]; vv.push_back(node); } }else if(vr.size()==0){ for(int j=0;j<vl.size();j++){ node = new TreeNode(i); node->left = vl[j]; vv.push_back(node); } }else{ for(int j=0;j<vl.size();j++){ for(int k=0;k<vr.size();k++){ node = new TreeNode(i); node->left = vl[j]; node->right = vr[k]; vv.push_back(node); } } } } } return vv; }};
==========================================updated on 1st, April, 2014====================
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<TreeNode *> generateTrees(int n) { vector<TreeNode*> v; v = build(1,n); return v; } vector<TreeNode*> build(int start,int end){ vector<TreeNode*> v; if(start>end){ v.push_back(NULL); return v; } if(start==end){ TreeNode* node = new TreeNode(start); v.push_back(node); return v; } vector<TreeNode*> left,right; for(int i=start;i<=end;i++){ left = build(start,i-1); right = build(i+1,end); for(int j = 0;j<left.size();j++){ for(int k=0;k<right.size();k++){ TreeNode* node = new TreeNode(i); node->left = left[j]; node->right = right[k]; v.push_back(node); } } } return v; } };
==========================================updated on 1st, April, 2014====================
==========================================updated on 4th, Sep, 2014==========================
class Solution {public: vector<TreeNode *> generateTrees(int n) { return dfs(1,n); } vector<TreeNode*> dfs(int start,int end){ vector<TreeNode*> v; if(start>end){ v.push_back(NULL); return v; } for(int i=start;i<=end;i++){ vector<TreeNode*> left = dfs(start,i-1); vector<TreeNode*> right = dfs(i+1,end); for(int j=0;j<left.size();j++){ for(int k=0;k<right.size();k++){ TreeNode* node = new TreeNode(i); node->left = left[j]; node->right = right[k]; v.push_back(node); } } } return v; }};
==========================================updated on 4th, Sep, 2014==========================
- 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
- 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
- 基础练习 数列特征
- poj 3438
- 李明远获新浪科技2013年度新锐科技领袖奖
- 循环链表
- 基础练习 查找整数
- Unique Binary Search Trees II
- 基础练习 杨辉三角形
- JSP struts 乱码问题 全整理
- 笔记本上在Emacs中忽略鼠标的操作
- 基础练习 特殊的数字
- 终于把服务器搞好了...
- 基础练习 回文数
- Shutting down 'imagePool' pool immediately [Shutdown Hook] 异常处理
- 图结构练习——BFSDFS——判断可达性