`

高度为n的平衡二叉树最少需要多少个节点

阅读更多

递推关系
A(1)=1
A(2)=2
A(n+2)=A(n+1)+A(n)+1
子树高度为n+1,n以及根节点
你可以照这个以此类推就可以得出答案了。算下A(4)=7

 

 

设f(n)为高度为n的平衡二叉树最少含有的节点数,则:f(1) = 1;f(2) = 2; f(3) = 4;f(4) = 7;……

这些可以通过画图就能得到,但是当n很大时呢?其实有如下结论:f(n) = f(n-1) + f(n-2) +1,(n>=3)。这个递推结论如何得到的呢?

引导问题:求一棵二叉树的节点数目:

假设一颗二叉树T,其左右子树分别为TL,TR。又假设T的节点数目为F(T),TL,TR的节点数目分别为F(TL),F(TR)。则显然:

F(T) = F(TL) + F(TR) + 1。

本文的问题:求高度为n的平衡二叉树最小需要多少节点:

同样假设T为高度为n的平衡二叉树,其需要最少的节点数目为F(n)。又假设TL,TR为T的左右子树,因此TL,TR也为平衡二叉树。假设F1,F2为TL,TR的最少节点数,则,F(n) = F1+F2 +1。那么F1,F2 到底等于多少呢?由于TL,TR与T一样是平衡二叉树,又由于我们知道T的最少节点数是F(n),其中n为T的高度,因此如果我们知道TL,TR的高度就可以知道F1,F2的值了。由平衡二叉树的定义可以知道,TL和TR的高度要么相同,要么相差1,而当TL与TR高度相同(即:都等于n-1)时,我们算出来的F(n)并不能保证最小,因此只有当TL与TR高度相差一(即:一个高度为n-1,一个高度为n-2)时,计算出来的F(n)才能最小。此时我们假设TL比TR高度要高1(即:TL高度为n-1,TR高度为n-2),则有:F1 = F(n-1),F2 = F(n-2)。因此得到结论:F(n) = F(n-1) + F(n -2 ) + 1!

这个地方推导思路稍微有点不清晰,应该都能明白,这个问题本来是很简单的问题,通过这个问题,我们可以看出递归的思想在树结构中的重要性,通过递归将问题抽象为多个规模更小的同类问题是解决这类问题的关键!当然,编程计算的时候一般用递推来计算较好(递归时会使用函数堆栈,函数堆栈是有限的,小心溢出).

 

分享到:
评论

相关推荐

    平衡二叉树(增加-删除)

    用JAVASCRIPT+VML实现平衡二叉树里增加节点删除节点的功能,目的是把二叉树的平衡算法记录在这里(备忘)。 目前只做了增加删除节点时二叉树自动平衡,保证这棵树什么时候都是平衡状态;如何将一棵不平衡的二叉树...

    二叉树递归和非递归遍历以及层次构建节点数为n的二叉树

    二叉树深度 二叉树前序遍历 递归实现 二种非递归实现 二叉树中序遍历: 递归实现 非递归实现 二叉树后序遍历: 递归实现 非递归实现 二叉树层次遍历 二叉树层次创建,创建方法遵循卡特兰数 ...

    平衡二叉树

    二叉树就需要进行调整而保持它的平衡性,由于每个节点上只有一个关键字,所以任何一次的的数据插入删除都有可能导致平衡二叉树的平衡调整,这种频繁的调整运算将大大降低平衡二叉树的存取效率,为解决以上问题,结合...

    二叉树 基础

    在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和...具有n个节点的完全二叉树的深度为log2n+1。深度为k的完全二叉树,至少有2^(k-1)个节点,至多有2^k-1个节点。

    交换二叉树的两个节点 c++

    交换二叉树的两个节点 c++ code blocks

    高度平衡的二叉树.

    高度平衡的二叉搜索树 �AVL( Addison-Velski and Landis )树 �伸展树 �红黑树

    平衡二叉树c++模版

    平衡二叉树c++模版,此模版採用二叉链表实现,是本人一个通宵搞出来的。可以提供时间复杂度在nlgn的排序,也可以提供lgn的查询。是一个很不错的数据结构,可是以和其它的现在比较新的一些数据结构比美。虽然有人对其...

    平衡二叉树操作的演示

    平衡二叉树操作的演示的课程设计,包附加的功能。

    二叉排序树与平衡二叉树的实现

    而在二叉排序树上进行查找时的平均查找长度和二叉树的形态有关: ①在最坏情况下,二叉排序树是通过把一个有序表的n个结点依次插入而生成的,此时所得的二叉排序树蜕化为棵深度为n的单支树,它的平均查找长度和...

    平衡二叉树遍历附源代码

    初始,平衡二叉树为空树,操作界面给出查找,插入和删除三种操作供 选择,每种操作均要提示输入关键字,每次插入或删除一个结点后应更新平衡二叉树的显示。 3并编程实现从键盘上输入一系列数据(整型),建立一棵...

    数据结构实习--平衡二叉树的演示(C语言编写)+实验报告

    利用平衡二叉树实现一个动态查找表。 (1)实现动态查找表的三种基本功能:查找、插入和删除。 (2)初始时,平衡二叉树为空树,操作界面给出查找、插入和删除三种操作供选择。每种操作均要提示输入关键字。在查找...

    求二叉树叶子节点总数与节点总数

    此程序可以建立二叉树并输出此二叉树的叶子节点总数与节点总数

    数据结构平衡二叉树课程设计

    C语言编写的 数据结构 平衡二叉树 演示、含课程设计报告 多种输出平衡二叉树格式

    课设 - 平衡二叉树的演示 .docx

    (1) 构建一个平衡二叉树并实现创建、插入、查找、删除、销毁等操作。每种操作均提示输入关键字。每次插入或删除一个结点后,更新平衡二叉树的显示。 (2) 平衡二叉树的显示采用凹入表现形式。 (3)输入的...

    二叉树和平衡二叉树的C#实现源码

    二叉树和平衡二叉树(B树)的C#实现源码 二叉树和平衡二叉树(B树)的C#实现源码 二叉树和平衡二叉树(B树)的C#实现源码

    平衡二叉树课程设计 课程设计

    平衡二叉树课程设计 平衡二叉树课程设计 平衡二叉树课程设计

    平衡二叉树数据结构课程设计

    平衡二叉树,平衡二叉树各种操作

    平衡二叉树的构造过程教程

    详细介绍平衡二叉树的构造过程,各节点的插入以及不平衡树的旋转

    数据结构之平衡二叉树的递归实现

    平衡二叉树各种操作的递归实现

Global site tag (gtag.js) - Google Analytics