计算所有结构不同的二叉树的数量的时间复杂度是多少?

2024-03-28

使用此处介绍的方法:http://cslibrary.stanford.edu/110/BinaryTrees.html#java http://cslibrary.stanford.edu/110/BinaryTrees.html#java



12. countTrees() Solution (Java)
/**
 For the key values 1...numKeys, how many structurally unique
 binary search trees are possible that store those keys?

 Strategy: consider that each value could be the root.
 Recursively find the size of the left and right subtrees.
*/
public static int countTrees(int numKeys) {
  if (numKeys <=1) {
    return(1);
  }
  else {
    // there will be one value at the root, with whatever remains
    // on the left and right each forming their own subtrees.
    // Iterate through all the values that could be the root...
    int sum = 0;
    int left, right, root;

    for (root=1; root<=numKeys; root++) {
      left = countTrees(root-1);
      right = countTrees(numKeys - root);

      // number of possible trees with this root == left*right
      sum += left*right;
    }

    return(sum);
  }
} 
  

我有一种感觉,可能是 n(n-1)(n-2)...1,即 n!

如果使用记忆器,复杂度是 O(n) 吗?


节点数为 n 的满二叉树的数量是第 n 个加泰罗尼亚数。加泰罗尼亚数字的计算方式为

复杂度为 O(n)。

http://mathworld.wolfram.com/BinaryTree.html http://mathworld.wolfram.com/BinaryTree.html

http://en.wikipedia.org/wiki/Catalan_number#Applications_in_combinatorics http://en.wikipedia.org/wiki/Catalan_number#Applications_in_combinatorics

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算所有结构不同的二叉树的数量的时间复杂度是多少? 的相关文章

  • 计算圆交点 O( (n+s) log n)

    我试图弄清楚如何设计一种算法 可以以 O n s log n 复杂度完成此任务 s 是交叉点的数量 我尝试在互联网上搜索 但找不到真正的东西 无论如何 我意识到拥有良好的数据结构是关键 我在java中使用红黑树实现 TreeMap 我还使用
  • java中的递归方法记忆化

    我正在做家庭作业 我已经筋疲力尽了 我是编程新手 这是我的第一堂编程课 这就是问题 考虑 Collat z java 中的以下递归函数 它与数论中一个著名的未解决问题 称为 Collat z 问题或 3n 1 问题 相关 public st
  • 使用递归从二叉搜索树中删除节点

    因此 我尝试使用类中的这两个函数从树中删除节点 不幸的是 它只是没有删除任何内容 我想知道它出了什么问题 任何帮助将不胜感激 def Find Min self node current node while current left is
  • ActiveSupport::Memoizes 指的是哪种 Ruby memoize 模式?

    因此在 Rails 3 2 中 ActiveSupport Memoizes 已被弃用 消息内容如下 DEPRECATION WARNING ActiveSupport Memoizable is deprecated and will b
  • 从二叉搜索树中删除节点,haskell

    我正在制作一个 Haskell 函数来从二叉搜索树中删除一个节点 我知道根据儿童数量需要采取的行动的规则 目标家长有 没有孩子 删除 1 个孩子 替换为孩子 2 个子节点 找到右子树中的最小值并用该值替换该节点 然后 递归删除右子树中的最小
  • 这个函数是 O(N+M) 还是 O(N*M)?

    def solution M A result 0 M maxCount 0 setAll 0 for i in range 0 len A if A i M 1 setAll maxCount maxCount 0 result 0 M
  • 如何使用{pre,in,post}顺序遍历结果重建BST

    我们知道前序 中序和后序遍历 什么算法可以重建 BST 因为是 BST in order可以排序自pre order or post order 其实 无论是pre order or post order只需要 如果你知道比较函数是什么 F
  • 求以下代码的上限和下限

    我需要找到以下代码的最接近的上限和下限 我是这方面的初学者 对我的错误感到抱歉 p 的上限为 O log n 下限为 O 1 notp 的上限为 O log n 下限为 O 1 我认为下界是 O 1 因为如果我有 n 4 那么我进入循环并且
  • 如何使用动态规划确定最长递增子序列?

    我有一组整数 我想找到最长递增子序列 https en wikipedia org wiki Longest increasing subsequence该集合使用动态规划 好的 我将首先描述最简单的解决方案 即 O N 2 其中 N 是集
  • 教科书上的长除法如何是 O(n^2) 算法?

    Premise This 维基百科页面 http en wikipedia org wiki Computational complexity of mathematical operations建议 的计算复杂度 教科书 长除法 http
  • 二叉树获取最左或最右底部

    我有一个存储二叉树的表 如下所示 Id ParentId Level Placement 47 1 0 0 23 47 1 0 86 47 1 1 5 23 2 0 29 23 2 1 68 86 2 0 8 5 3 1 31 29 3 1
  • 在 C 中将二叉树转换为数组(并随后保存)

    所以 我正在做这个客户应用程序 您可以在其中创建 修改 搜索 列出客户 后来 这扩展到通过订单等方式将客户与产品联系起来 但我现在的重点只是客户 我已经创建了一个二叉树 所有这些功能都可以工作 但是我需要一种方法来存储创建的客户以供下次使用
  • 我可以检查子序列是否比 O(n*n) 更快

    所以我的问题是主题的名称 是否存在一种算法可以比 O N 2 更快地检查 B 是否是 A 的子序列 例如 O NlogN 或简单的 O N 找到的唯一方法是简单的暴力 for int i 0 i lt a Length b Length i
  • 2 个二叉树的交集会引发堆栈溢出错误

    我试图将两个二叉树相交 并使用相同的节点创建一个新的二叉树 但以下内容会产生 stackOverflow 错误 谁能帮我 private OrderedSet
  • 为什么在算法中使用子树大小来选择二叉树中的随机节点?

    我偶然发现了从二叉树中选择随机节点的算法的几种实现 它们都使用子树大小属性 但是 我不明白为什么知道子树大小有帮助 这是实现A https stackoverflow com a 32011526 and B https www geeks
  • 在对数时间内找到未排序数组中的最小值

    是否有一种算法方法可以在对数时间 O logn 内找到未排序数组的最小值 或者只能在线性时间内实现 我不想并行 Thanks Michael 如果列表未排序 则您的搜索必须至少是线性的 每个项目你必须至少看一遍 因为任何你没看过的东西mig
  • 为什么A*的复杂度在内存中是指数级的?

    维基百科关于 A 复杂度的说法如下 链接在这里 http en wikipedia org wiki A search algorithm 比当时更成问题 复杂度是A 的内存使用量 在 最坏的情况 也必须记住 指数数量的节点 我不认为这是正
  • 如何交错或创建两个字符串的唯一排列(无需递归)

    问题是打印两个给定字符串的所有可能的交错 所以我用 Python 编写了一个工作代码 其运行如下 def inter arr1 arr2 p1 p2 arr thisarr copy arr if p1 len arr1 and p2 le
  • 编辑距离(Levenshtein距离)递归自上而下实现的复杂性

    I have been working all day with a problem which I can t seem to get a handle on The task is to show that a recursive im
  • 生成所有可能的树

    给定以下数据类型定义 data FormTree Empty Node FormTree FormTree deriving Show 我想编写一个函数 它生成一个无限列表 其中包含按长度排序的所有可能的树 例如节点数量 下面的代码几乎满足

随机推荐