有n个结点的平衡二叉树的最小、最大深度,及深度的数量级

这篇具有很好参考价值的文章主要介绍了有n个结点的平衡二叉树的最小、最大深度,及深度的数量级。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

求有n个结点的平衡二叉树的深度范围:

1. 求有n个结点的平衡二叉树的最小深度

显然,n个结点的平衡二叉树深度最小时,前h-1层是满的,只有最下面一层不满。这样的树类似完全二叉树,其高度也可以通过类似求n个结点完全二叉树高度的方法求出。
n个结点的这样的树的深度为 ⌊ l o g 2 n ⌋ + 1 \lfloor log_2n \rfloor+1 log2n+1(见满二叉树及完全二叉树的相关性质证明)
因此n个结点的平衡二叉树深度最小值为 ⌊ l o g 2 n ⌋ + 1 \lfloor log_2n \rfloor+1 log2n+1

2. 求有n个结点的平衡二叉树的最大深度

引理1:对一棵深度为h的平衡二叉树删掉一些结点后,可以得到一棵深度为 h ′ h' h更小的平衡二叉树, h ′ h' h是满足 h ′ < h h'<h h<h的任意正整数。

如果原树的深度为h,其两棵子树中一定有一棵子树深度为h-1,那么删掉根结点和另一棵子树,保留深度为h-1的子树,即可以在删掉一些结点后,得到一棵深度为h-1的平衡二叉树。重复该过程,即可得到一棵深度小于原树深度的平衡二叉树。

设深度为h的平衡二叉树的最少结点数为 N h N_h Nh
引理2:已知 h 1 < h 2 h_1<h_2 h1<h2,那么一定有 N h 1 < N h 2 N_{h_1} < N_{h_2} Nh1<Nh2
即平衡二叉树深度h越小,构建深度为h的平衡二叉树需要用到的最少结点数目越少。

反证法:假设已知 h 1 < h 2 h_1<h_2 h1<h2,有 N h 1 ≥ N h 2 N_{h_1} \ge N_{h_2} Nh1Nh2
N h 2 N_{h_2} Nh2个结点可以构建出一棵深度为 h 2 h_2 h2的平衡二叉树。
根据引理1,在这棵树上删掉一些结点后,可以让这棵树的深度减少,变为 h 1 h_1 h1。剩余的树上的结点数量 N ′ N' N一定满足: N ′ < N h 2 N' <N_{h_2} N<Nh2
根据假设有 N h 2 ≤ N h 1 N_{h_2} \le N_{h_1} Nh2Nh1,所以 N ′ < N h 2 ≤ N h 1 N'<N_{h_2}\le N_{h_1} N<Nh2Nh1,即 N ′ < N h 1 N'< N_{h_1} N<Nh1
N ′ N' N是一个深度为 h 1 h_1 h1的平衡二叉树的结点数, N ′ < N h 1 N'< N_{h_1} N<Nh1与深度为 h 1 h_1 h1时平衡二叉树的最少结点数量为 N h 1 N_{h_1} Nh1相矛盾。
假设不成立,原命题得证。

要想使深度为h的平衡二叉树的结点最少,那么它的左右子树一定结点最少。

  • 情况1:左右子树深度都为h-1,结点数都是最少的,都为 N h − 1 N_{h-1} Nh1,加上根结点,整棵树的结点数 N h = 2 N h − 1 + 1 N_h=2N_{h-1}+1 Nh=2Nh1+1
  • 情况2:左右子树深度之差为1,即一个子树深度是h-1,另一个子树深度是h-2,整棵树的结点数 N h = N h − 1 + N h − 2 + 1 N_h=N_{h-1}+N_{h-2}+1 Nh=Nh1+Nh2+1

根据引理2,有 N h − 2 < N h − 1 N_{h-2} < N_{h-1} Nh2<Nh1
所以深度为h的平衡二叉树结点数最少时,左右子树深度一定不同,相差1,有
N h = N h − 1 + N h − 2 + 1 N_h=N_{h-1}+N_{h-2}+1 Nh=Nh1+Nh2+1

对于有n个结点的平衡二叉树,如果n满足 N h ≤ n < N h + 1 N_h\le n < N_{h+1} Nhn<Nh+1,那么n个结点可以构建的平衡二叉树的最大深度为h。

解释:
要构建深度为h的平衡二叉树最少需要 N h N_h Nh个结点,现在有n( n ≥ N h n\ge N_h nNh)个结点,可以构建深度为h的平衡二叉树。
如果要构建深入为h+1的平衡二叉树,最少需要 N h + 1 N_{h+1} Nh+1个结点,n个结点还不够。
所以如果 N h ≤ n < N h + 1 N_h\le n < N_{h+1} Nhn<Nh+1,n个结点可以构建的平衡二叉树的最大深度为h。

设斐波那契数列第i项为 F i F_i Fi,已知 F 1 = 1 , F 2 = 1 , F 3 = 2 , . . . F_1=1, F_2=1, F_3=2,... F1=1,F2=1,F3=2,...
证明: N h = F h + 2 − 1 N_h=F_{h+2}-1 Nh=Fh+21

数学归纳法证明

  1. N 1 = 1 = F 3 − 1 N_1=1=F_3-1 N1=1=F31
  2. 假设 N h = F h + 2 − 1 N_h=F_{h+2}-1 Nh=Fh+21,证明 N h + 1 = F h + 3 − 1 N_{h+1}=F_{h+3}-1 Nh+1=Fh+31
    N h + 1 N_{h+1} Nh+1
    = N h + N h − 1 + 1 =N_h+N_{h-1}+1 =Nh+Nh1+1
    = F h + 2 − 1 + F h + 1 − 1 + 1 =F_{h+2}-1+F_{h+1}-1+1 =Fh+21+Fh+11+1
    = F h + 2 + F h + 1 − 1 =F_{h+2}+F_{h+1}-1 =Fh+2+Fh+11
    = F h + 3 − 1 =F_{h+3}-1 =Fh+31

已知 N h ≤ n < N h + 1 N_h\le n < N_{h+1} Nhn<Nh+1,因此 F h + 2 − 1 ≤ n < F h + 3 − 1 F_{h+2}-1\le n < F_{h+3}-1 Fh+21n<Fh+31
n个结点构成的平衡二叉树的最大深度的精确数值通过数学公式很难计算,这里给出算法:
通过递推算法先求出斐波那契数列,枚举每个斐波那契数,得到第一个满足大于n+1的斐波那契数,这个数是斐波那契数列的第i项,那么n个结点构成的平衡二叉树的最大深度为i-3。

#include<bits/stdc++.h>
using namespace std;
int main()
{//输入结点数量n,输出n个顶点可以构成的平衡二叉树的最大深度
	int n, a = 2, b = 3, t;
	cin >> n;//结点数量n一定是正整数 
	for(int i = 4; true; ++i)//当前b是斐波那契数列第i项
	{
		if(b > n+1)
		{
			cout << i-3;
			return 0;
		}
		b = b+a;//最后求出的斐波那契数 
		a = b-a;
	}
	return 0;
}

3. 有n个结点的平衡二叉树的深度的数量级

当n很大时,估算h的数量级:
平衡二叉树深度最小时,深度为 ⌊ l o g 2 n ⌋ + 1 \lfloor log_2n \rfloor+1 log2n+1,其数量级为 O ( l o g n ) O(logn) O(logn)
平衡二叉树深度最大时:
已知 F h + 2 − 1 ≤ n < F h + 3 − 1 F_{h+2}-1\le n < F_{h+3}-1 Fh+21n<Fh+31
那么 F h + 2 ≤ n + 1 < F h + 3 F_{h+2}\le n+1 < F_{h+3} Fh+2n+1<Fh+3
根据斐波那契数列的通项公式: F n = 1 5 ( ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ) F_n = \frac{1}{\sqrt{5}}((\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n) Fn=5 1((21+5 )n(215 )n)
由于 ∣ 1 − 5 ∣ < 2 |1-\sqrt{5}|<2 15 <2,所以当n很大时, ( 1 − 5 2 ) n (\frac{1-\sqrt{5}}{2})^n (215 )n趋近于0。
因此可以认为: F n ≈ 1 5 ( 1 + 5 2 ) n F_n \approx \frac{1}{\sqrt{5}}(\frac{1+\sqrt{5}}{2})^n Fn5 1(21+5 )n
ϕ = 1 + 5 2 \phi=\frac{1+\sqrt{5}}{2} ϕ=21+5 ,有 ϕ h + 2 ≤ 5 ( n + 1 ) < ϕ h + 3 \phi^{h+2}\le \sqrt{5}(n+1) <\phi^{h+3} ϕh+25 (n+1)<ϕh+3
取对数
h + 2 ≤ l o g ϕ 5 ( n + 1 ) < h + 3 h+2\le log_\phi{\sqrt{5}(n+1)}<h+3 h+2logϕ5 (n+1)<h+3
有: l o g ϕ 5 ( n + 1 ) − 3 < h ≤ l o g ϕ 5 ( n + 1 ) − 2 log_\phi{\sqrt{5}(n+1)} -3< h \le log_\phi{\sqrt{5}(n+1)}-2 logϕ5 (n+1)3<hlogϕ5 (n+1)2
树深度h的数量级为:
O ( h ) = O ( l o g ϕ 5 ( n + 1 ) − 2 ) = O ( log ⁡ ϕ 5 + l o g ϕ ( n + 1 ) ) = O ( l o g n ) O(h)=O(log_\phi{\sqrt{5}(n+1)}-2)=O(\log_\phi{\sqrt{5}+log_\phi(n+1)})=O(log n) O(h)=O(logϕ5 (n+1)2)=O(logϕ5 +logϕ(n+1))=O(logn)
因此,有n个结点的平衡二叉树的深度的数量级为 O ( l o g n ) O(log n) O(logn)文章来源地址https://www.toymoban.com/news/detail-742271.html

到了这里,关于有n个结点的平衡二叉树的最小、最大深度,及深度的数量级的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法第十四天7.28】二叉树的最大深度,二叉树的最小深度 ,完全二叉树的节点个数

    链接 力扣104-二叉树的最大深度 思路 链接 力扣111-二叉树的最小深度 思路 链接 力扣222-完全二叉树的节点个数 思路

    2024年02月14日
    浏览(41)
  • 二叉树的最大深度和最小深度(两种方法:递归+迭代)

    二叉树的最大深度:   二叉树的最小深度: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。  输入:root = [3,9,20,null,null,15,7] 输出:2  

    2024年02月15日
    浏览(39)
  • 代码随想录 Day13 二叉树 LeetCode T104 二叉树的最大深度 T111 二叉树的最小深度 T222完全二叉树的节点个数

    以下题解的更详细思路来自于:代码随想录 (programmercarl.com) 二叉树的高度与深度 这里先补充一下二叉树深度和高度的概念 高度:二叉树中任意一个节点到叶子结点的距离 深度:二叉树中任意一个节点到根节点的距离 下面给出一个图便于理解 获取高度与深度的遍历方式 高度:后

    2024年02月08日
    浏览(41)
  • 算法训练day16Leetcode104二叉树最大深度111二叉树最小深度222完全二叉树的节点个数

    https://www.bilibili.com/video/BV1Gd4y1V75u/?vd_source=8272bd48fee17396a4a1746c256ab0ae 用递归,但是什么顺序没想清楚 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始) 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边

    2024年01月16日
    浏览(44)
  • 【力扣 - 二叉树的最大深度】

    给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 树中节点的数量在 [0, 10^4] 区间内。 如果我们知道了左子树和右子树的最大深度 l 和 r ,那么该二叉树的最大深度即为 而左子树和右子树的最大深度又可以以

    2024年02月21日
    浏览(37)
  • 每日一练:LeeCode-111. 二叉树的最小深度【二叉树】

    本文是力扣LeeCode-111. 二叉树的最小深度 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。 给定一个 二叉树 ,找出其 最小深度 。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量 。 说明: 叶子节点是指没有子节点的节点 。 示

    2024年02月02日
    浏览(41)
  • 二叉树OJ题:LeetCode--104.二叉树的最大深度

    朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第104道二叉树OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏: 数据结构与算法 个  人  主  页  : stackY、 C 语 言 专 栏 : C语言:从入门到精通  Leet

    2024年02月11日
    浏览(83)
  • 【算法题解】34. 二叉树的最小深度

    这是一道 简单 题 https://leetcode.cn/problems/minimum-depth-of-binary-tree/ 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明 :叶子节点是指没有子节点的节点。 示例 1: 示例 2: 提示: 树中节点数的范围在 [ 0 , 1 0 5 ] [0, 10^5] [

    2024年02月08日
    浏览(49)
  • leetcode 104——二叉树的最大深度

    给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 leetcode104 在解决树相关的问题时,一定要考虑能不能使用递归解决,如果使用递归解决,问题一般都能变得很简单,详情请看代码。

    2024年02月03日
    浏览(39)
  • 【LeetCode】104.二叉树的最大深度

    给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明:  叶子节点是指没有子节点的节点。 示例: 给定二叉树  [3,9,20,null,null,15,7] , 返回它的最大深度 3 。 我一开始是想通过深度优先搜索,每次到达子节点都更新一下当

    2024年02月15日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包