0.总结


Get to the key point firstly, the article comes from LawsonAbs!

  • N个节点的二叉树的形态数的推导
  • 卡特兰数
  • 相关例题的分析

1.问题

由N个节点构成的二叉树的形态数是多少。
例如,当n=1时,如下图所示,二叉树只有一种形态;

当n=2时,二叉树有2种形态。


那么 n 的值更一般的时候,是怎么推导的?
step 1.令 dp[i] 表示节点数为i时,其具有的形态个数;
step 2.根据常识有,dp[0] = 1; dp[1]=1;没有节点或者只有一个节点时,都是1。现在就以n=3为例,推一下n=3时的情形。考虑如何放这三个节点,分步骤来操作:
固定一个根节点,再将剩余的节点放到左右两个子树中。那么 dp[3] 就是这些方法的总和。放根节点的方法只有一个,那么问题就是放剩余的两个节点的方法有多少种?可以像下面这么安排:

  • 左子树放2个,右子树放0个;

    公式也就是
    dp[1]*dp[2]*dp[0] = 2【dp[1]表示根节点是1个节点时的形态数目; dp[2]表示的是左子树有两个节点时的形态数目;dp[0]表示的是右子树有0个节点时的形态数目】

  • 左子树放1个,右子树放1个;


公式:
dp[1]*dp[1]*dp[1] = 1【dp[1]表示根节点是1个节点时的形态数目; dp[1]表示的是左子树有1个节点时的形态数目;dp[1]表示的是右子树有1个节点时的形态数目】

  • 左子树放0个,右子树放2个;


    公式:
    dp[1]*dp[0]*dp[2] = 2【dp[1]表示根节点是1个节点时的形态数目; dp[0]表示的是左子树有0个节点时的形态数目;dp[2]表示的是右子树有2个节点时的形态数目】
    上述三个公式的和就是dp[3]。因为dp[1]=1,所以可以省去不写。

    以此类推,那么得到的结果就是 dp[n] = dp[0]*dp[n-2] + dp[1]*dp[n-1] +.... + dp[n-1]*dp[1] + dp[n-2]*dp[0]。这个式子也就是著名的卡特兰数。

N个节点的二叉树的形态数详细推导相关推荐

  1. 卡特兰数(n个节点的二叉树情况数量+hdu2067) (超级卡特兰数(施罗德数))

    卡特兰数是组合数学中一个常出现在各种计数问题中的数列. 举个栗子:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742 ...

  2. 把一棵树转换为二叉树后,这棵二叉树的形态是( )

    题目 把一棵树转换为二叉树后,这棵二叉树的形态是( ) A. 唯一的 B. 有多种 C. 有多种,但根节点都没有左孩子 D. 有多种,但根节点都没有右孩子 答案 A 解析 树转换为二叉树 由于二叉树是 ...

  3. 给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构(算法导论第十章10.4-3)

    给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构 (算法导论第十章10.4-3) template<typename T> ...

  4. 给定一个n节点的二叉树,写出一个O(n)时间递归过程,将该树每个节点关键字输出(算法导论第十章10.4-2)

    给定一个n节点的二叉树,写出一个O(n)时间递归过程,将该树每个节点关键字输出 (算法导论第十章10.4-2) #include <iostream> template<typena ...

  5. n个节点的二叉树n+1_使用C ++程序将链接列表中的最后N个节点附加到第一个

    n个节点的二叉树n+1 Given a linked list and an integer n, append the last n elements of the LL to front. Ass ...

  6. n个节点的二叉树n+1_使用C ++程序删除链接列表的M个节点后的N个节点

    n个节点的二叉树n+1 Problem statement: 问题陈述: Given a Linked List, we have to delete N numbers of nodes after ...

  7. 牛牛有一棵n个节点的二叉树,该二叉树每个节点的权值为1。牛牛想要删掉该树其中的k层节点,删除序列为a1,a2...ak。 如有一棵二叉树,删除其中的第3层节点

    题目:牛牛有一棵n个节点的二叉树,该二叉树每个节点的权值为1.牛牛想要删掉该树其中的k层节点,删除序列为a1,a2-ak. 如有一棵二叉树,删除其中的第3层节点 思路: 层序遍历,遍历时对节点依次进行 ...

  8. 二叉树N叉数的前中后序遍历总结,python实现递归法和迭代法

    关于二叉树的前序遍历(preoder).中序遍历(inorder)和后序遍历(postorder),实际上只需要记住:左子节点一定在右子节点的左边(左右),所谓前中后序遍历就是根节点的位置不同,前序是 ...

  9. 数据结构 day07 基础知识学习 (二叉树 的 前中后遍历 ,插入节点,删除叶子节点, 二叉树的节点个数 )

    一.今天有点迷. 二.希望大家看的懂代码 ,我已经很努力写注释了. 三.这次的知识很基础 ,(老师关于 二叉树节点删除的哪里 讲的有点差 ,主要是讲之前没有打好框架   (关于父节点的定义   )  ...

最新文章

  1. BZOJ 3597 SCOI2014 方伯伯送椰子 网络流分析+SPFA
  2. python中 __init__.py的例程
  3. 8 种架构设计模式优缺点大曝光 | 原力计划
  4. 【Python3爬虫】用Python中的队列来写爬虫
  5. Swing绝对布局之setBounds
  6. 在传统软件公司十年深恶痛绝的感受
  7. 个人博客搭建系列(一) 之 阿里云购买域名及解析对应ip地址
  8. 在vue中使用videoJs实现前端视频流
  9. 均分纸牌(线性、环形、二维)
  10. C#合并多个pdf到一个pdf文件;不使用Aspose.pdf.dll,避免水印
  11. 和讯金融界证券之星 财经网站竞争格局突变
  12. 常用的行列式和矩阵的性质
  13. 腾讯高级工程师带你完整体验Node.js开发实战
  14. Chart.js中文文档-雷达图
  15. 基于Python经典版成语接龙逻辑实现
  16. 电商项目超详细测试点整理(一)
  17. SAP-FICO CO凭证的相关知识点
  18. 为用户设计舒适的姿势
  19. You may have an infinite update loop in a component render function问题解决
  20. DirectX 9.0 (6)聚光灯

热门文章

  1. 2022-2027年中国光掩膜版市场规模现状及投资规划建议报告
  2. Android开发——NFC标签读写
  3. 计算机英语新词的认知语义阐释论文,汉语言文学-网络流行语的认知语义阐释-毕业论文格式范文(2)-优度********网...
  4. 计算机及图像处理专业英语词典,计算机英语 IT专业英语词典 36
  5. 工作为了生活,却远远不止于生活
  6. 平面设计--构图必学
  7. matlab滤波器fdatool,各种类型滤波器设计(fdatool,原理,matlab代码)
  8. 孤陋寡闻系列。。。泛型
  9. drupal_Drupal中的Gutenberg编辑器入门
  10. 电动汽车充电方式有哪些?