不同的二叉查找树I:

题目内容:

给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种?

样例:

给出n = 3,有5种不同形态的二叉查找树:

1           3    3       2      1\         /    /       / \      \3      2     1       1   3      2/      /       \                  \
2     1          2                  3

算法分析:

先来看一下二叉查找树的特点,当选定一个节点i作为中间节点时:

  ①位于该节点左子树中的所有节点均小于i,假设该节点的左子树的排列情况有m种;

  ②位于该节点右子树中的所有节点均大于i,假设该节点的右子树的排列情况有n种;

  ③综合①和②,当节点i作为当前二叉查找树的首节点时,该二叉查找树的总排列数目有m*n;

因此对于一个拥有n个节点的二叉查找树,其每一个节点均能成为某一二叉查找树的首节点,因此动态规划的表达式为:

  DP[i] = sum{ DP[j-1] * DP[i-j] },其中1=< j <=i,DP[i]表示i个节点所能组成的二叉查找树的数目;

代码: 

 public int numTrees(int n) {// write your code hereif(n==0)return 1;int[] result = new int[n+1];result[0]=1;result[1]=1;for(int i=2;i<=n;i++){for(int j=1;j<=i;j++){int left=result[j-1];int right=result[i-j];result[i]+=left*right;}}return result[n];}

不同的二叉查找树II:

题目内容:

给出n,生成所有由1...n为节点组成的不同的二叉查找树;

样例:

给出n = 3,有5种不同形态的二叉查找树:

1           3    3       2      1\         /    /       / \      \3      2     1       1   3      2/      /       \                  \
2     1          2                  3

算法分析:

本题在 I 的基础上要求返回的不是组数而是具体的组合,很明显本题需要用递归的方式来解决问题,和 I 的思想基本一致,在递归的过程中找出所有的左右子树的排列组合,然后分别连接到当前节点的左子树和右子树,将结果作为当前层的二叉查找树的所有排列组合进行返回。

代码:

HashMap<String,List<TreeNode>> map = new HashMap<>();public List<TreeNode> findSolution(int begin, int end){List<TreeNode> result = new ArrayList<>();if(begin>end){result.add(null);return result;}if(begin==end){TreeNode temp = new TreeNode(begin);result.add(temp);return result;}String tag = String.valueOf(begin)+"-"+String.valueOf(end);if(map.get(tag)!=null){return map.get(tag);}for(int i=begin;i<=end;i++){List<TreeNode> left = findSolution(begin,i-1);List<TreeNode> right = findSolution(i+1,end);if(left.size()!=0&&right.size()!=0){for(TreeNode t1:left){for(TreeNode t2:right){TreeNode temp = new TreeNode(i);temp.left = t1;temp.right=t2;result.add(temp);}}}if(left.size()!=0&&right.size()==0){for(TreeNode t1:left){TreeNode temp = new TreeNode(i);temp.left = t1;result.add(temp);}}if(left.size()==0&&right.size()!=0){for(TreeNode t2:right){TreeNode temp = new TreeNode(i);temp.right = t2;result.add(temp);}}}map.put(tag,result);return result;}public List<TreeNode> generateTrees(int n) {// write your code heremap = new HashMap<>();return findSolution(1,n);/*long startTime=System.nanoTime();List<TreeNode> result = findSolution(1,n);long endTime=System.nanoTime();System.out.println("运行时间为:"+(endTime-startTime));return result;*/}

代码中我还建立了一个map作为中间结果的记录,用来降低一些重复区间段求解的时间开销,其效果还是很明显的,当n=11时,没有map的算法时间开销为124313992ns,而有map的算法时间开销为82106610ns;但是这题我我试了下即使不用map也能够AC;

转载于:https://www.cnblogs.com/Revenent-Blog/p/7568627.html

LintCode刷题——不同的二叉查找树I、II相关推荐

  1. LintCode刷题——打劫房屋I、II、III

    打劫房屋I: 题目内容: 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该 ...

  2. 二、lintcode刷题记录--二叉树的路径和

    LintCode刷题记录---二叉树的路径和(效率可能没有那些专业的高,主要是代码结构比较简单) ) 题目地址:http://www.lintcode.com/zh-cn/problem/binary ...

  3. 子集和问题 算法_LeetCode刷题实战90:子集 II

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  4. LintCode刷题:有效数字

    今天第一次是跟随一个博主学习足迹知道有LintCode 和LeetCode这两个刷题网址,专为学编程的同志练手,我希望我可以每天坚持刷一题!!!! 第一次不知道直接点"帮我挑一题" ...

  5. LintCode刷题(入门篇)

    最近在玩LintCode上面的算法题.下面分享一下部分题目的答案.如果其他同学有更好的答案,可以和我交流讨论,本人菜鸟一个,各位大佬多指点. 同时说一下,这个上面的二叉树 和 链表 我不懂,所以这类题 ...

  6. 如何判断链表中是否存在环?Floyd判圈算法 leetcode刷题笔记 142. 环形链表 II

    这道题使用了floyd判圈算法,所以先讲解floyd算法的原理和实现,最后在附加上第142题的代码. floyd算法: 一.用途: 可以在有限状态机.迭代函数或者链表上判断是否存在环,求出该环的起点与 ...

  7. C#LeetCode刷题之#598-范围求和 II​​​​​​​(Range Addition II)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3881 访问. 给定一个初始元素全部为 0,大小为 m*n 的矩阵 ...

  8. lintcode刷题 14. 二分查找,迭代和二分法Python实现

    14. 二分查找 描述 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. ...

  9. Leetcode刷题笔记——剑指offer II (六)【图】

    文章目录 图 695. 岛屿的最大面积 剑指 Offer II 106. 二分图 (每条边的两个结点都来自不同的集合) 剑指 Offer II 107. 矩阵中的距离 (最短路问题,建图,BFS) 剑 ...

最新文章

  1. Polycom开启“创新协作+”时代 全新解决方案闪耀京城
  2. vsftp安装与配置(通过虚拟用户登录)
  3. 【Python初学者】准备
  4. jsf集成spring_Spring和JSF集成:异常处理
  5. 杂谈(7)努力就有收获
  6. node创建新html页面,node创建服务器之展示html页面
  7. php self this static,php面向对象中self和static的区别
  8. 设计模式七大原则简述
  9. Atitit 下推自动机﹙PDA﹚说明书 目录 1. 概念组成与原理成分 1 2. 性状 1 3. 适用场景 主治 适应症 1 3.1. 所有场景()。 1 3.2. 语法解析 构建ast 2 3.
  10. 调用手机扫描二维码功能
  11. php主动防御,汽车主动防御系统
  12. 怎么做好客户关系管理培训PPT课件?
  13. 上海智能交通建设现状与未来发展要点
  14. ApacheCN 翻译活动进度公告 2019.6.21
  15. 3d slicer matlab,使用3D Slicer进行颅骨去除
  16. 罗升阳:那两年炼就的Android内功修养(转载老罗的)
  17. uni-app【多媒体API】
  18. python endswith函数_python endswith和startwith
  19. C++之一些事一些情--变量值的溢出问题
  20. 中小企业融资解决方案

热门文章

  1. 保障粮食安全-农业大健康-温铁军 谋定落实粮食安全责任
  2. vue-cli3.0 Typescript 项目集成环信WebIM 群组聊天
  3. 盒子模型+浮动布局+定位布局
  4. vscode 好用插件
  5. ELASTIC的备份与恢复
  6. AJAX跨域请访问的问题
  7. VB中判断空的几种方法,Null, Missing, Empty, Nothing, vbNullString区别
  8. RMI-IIOP与JNDI简单小结
  9. 【分析】立即购买vs加入购物车,移动电商购买流程差异分析
  10. 华为Mate20首支预告片爆出,30秒内包含太多黑科技