比如输入为n, 这道题目就是让返回由1,2,... n的组成的所有二叉排序树,每个树都必须包含这n个数

这是二叉树的排列组合的题目。排列组合经常用DFS来解决。

这道题比如输入为3,也就是求start=1, end=3的所有树,简写为t[1,3]。那么就要考虑这些情况:

//t[a,b]={NULL} if a>b

root为1,left为t[1,0], right为t[2,3]    left为{NULL}, right为两个树(见下面解释)

root为2,left为t[1,1], right为t[3,3]

root为3,left为t[1,2], right为t[4,3]

类似,要求t[2,3], 就要考虑下面情况

root为2,left为t[2,1], right为t[3,3], 可以看出只有一个

root为3,left为t[2,2], right为t[4,3], 也只有一个

另外对于DFS,为防止重复计算,可以用map来存储计算过的t[x,y]。这也是经常用到的办法。

class Solution {
public:
vector<TreeNode*> generateTreesDFS(int start, int end, map<pair<int,int>, vector<TreeNode*>>& vecTreeMap) {
vector<TreeNode*> subTree;
if(vecTreeMap.find({start, end}) != vecTreeMap.end())
return vecTreeMap[{start,end}];
//a(start)
//a(end)
//ahd(subTree)
if (start > end) subTree.push_back(NULL);
else {
for (int i = start; i <= end; ++i) {
vector<TreeNode*> leftSubTree = generateTreesDFS(start, i - , vecTreeMap);
vector<TreeNode*> rightSubTree = generateTreesDFS(i + , end, vecTreeMap);
for (int j = ; j < leftSubTree.size(); ++j) {
for (int k = ; k < rightSubTree.size(); ++k) {
TreeNode *node = new TreeNode(i);
node->left = (leftSubTree)[j];
node->right = (rightSubTree)[k];
subTree.push_back(node);
}
}
}
//dsp
}
vecTreeMap[{start, end}] = subTree;
return subTree;
} vector<TreeNode*> generateTrees(int n) {
if(n==) return {};
map<pair<int,int>, vector<TreeNode*>> vecTreeMap;
//amap(vecTreeMap, pair<int,int>, vector<TreeNode*>)
return generateTreesDFS(,n, vecTreeMap);
}
};

程序动态运行过程:http://simpledsp.com/FS/Html/lc95.html

LeetCode 95. Unique Binary Search Trees II 动态演示的更多相关文章

  1. [LeetCode] 95. Unique Binary Search Trees II(给定一个数字n,返回所有二叉搜索树) ☆☆☆

    Unique Binary Search Trees II leetcode java [LeetCode]Unique Binary Search Trees II 异构二叉查找树II Unique ...

  2. [leetcode]95. Unique Binary Search Trees II给定节点形成不同BST的集合

    Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...

  3. [LeetCode] 95. Unique Binary Search Trees II 唯一二叉搜索树 II

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

  4. [LeetCode] 95. Unique Binary Search Trees II 独一无二的二叉搜索树之二

    Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...

  5. leetcode 95 Unique Binary Search Trees II ----- java

    Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...

  6. leetCode 95.Unique Binary Search Trees II (唯一二叉搜索树) 解题思路和方法

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

  7. [leetcode]95 Unique Binary Search Trees II (Medium)

    原题 字母题添加链接描述 一开始完全没有思路.. 百度看了别人的思路,对于这种递归构造的题目还是不熟,得多做做了. 这个题目难在构造出来.一般构造树都需要递归. 从1–n中任意选择一个数当做根节点,所 ...

  8. 【LeetCode】95. Unique Binary Search Trees II 解题报告(Python)

    [LeetCode]95. Unique Binary Search Trees II 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzh ...

  9. leetcode 96. Unique Binary Search Trees 、95. Unique Binary Search Trees II 、241. Different Ways to Add Parentheses

    96. Unique Binary Search Trees https://www.cnblogs.com/grandyang/p/4299608.html 3由dp[1]*dp[1].dp[0]* ...

随机推荐

  1. P4542 [ZJOI2011]营救皮卡丘(Floyd+网络流)

    P4542 [ZJOI2011]营救皮卡丘 乍一看似乎没啥题相似的 仔细一看,$N<=150$ 边又是双向边,似乎可以用Floyd搞   先跑一遍Floyd处理出$dis[i][j]$ 注意到走 ...

  2. 浅谈随机数发生器(C语言)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/svitter/article/details/30971395 本文出自:点击打开链接 本来在做数据 ...

  3. Windows下svn使用教程

    SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subversion是什么? ...

  4. Django 高级配置

    目录 Django 信号 信号系统三要素: 信号的分类: Django 内置信号: 具体 Django 信号内容 定义信号 发送信号 接收信号 信号接收器 防止重复信号 Django 内置信号操作步骤 ...

  5. Winfrom 弹出窗体位置设定

    Winfrom 窗体弹出位置设定,其实就是两种模式,第一种模式是通过Winform提供的属性来设定:第二种模式是自定义,可以相对于软件本身,也可以是相对于屏幕. 一.第一种模式 使用Winform提供 ...

  6. ltp-ddt eth_iperf_tcp iperf dualtest遇到的问题

    ltp-ddt eth_iperf_tcp server端:iperf -s -i 5 -w 1M client端将ddt的核心代码抠出来: iperf -c 1921.68.40.41 -m -M ...

  7. fork/join并发编程

    Fork & Join 的具体含义 Fork 一词的原始含义是吃饭用的叉子,也有分叉的意思.在Linux 平台中,函数 fork()用来创建子进程,使得系统进程可以多一个执行分支.在 Java ...

  8. javascript实现下拉菜单的显示与隐藏

    demo.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  9. Maven POM中的各种scope的行为总结

    compile:默认的scope.任何定义在compile scope下的依赖将会在所有的class paths下可用.maven工程会将其打包到最终的artifact中.如果你构建一个WAR类型的a ...

  10. 16_3.jdk动态代理与aop

    jdk动态代理: public interface Subject { void say(String name,int age); } public class RealSubject implem ...