树和二叉树的基本性质及其推导

article/2025/8/26 20:43:55

1 树的基本性质

在这里插入图片描述

性质 1 :树中的节点数等于所有节点度数加 1

每个节点的度数分别对应节点的子节点,设所有节点的度数为 d,总结点数为n,则 n = d + 根节点,即 n = d + 1
设总结点数为n,树中除根节点外,每个节点都对应一个分支,因此 树中总分支数为 n - 1

性质 2 :度为 m 的树中第 i 层至多有 m i − 1 m^{i-1} mi1个节点( i ≥ 1 i\geq 1 i1)

使用归纳法证明:

  1. 第一层,即 i = 1。至多有 m 0 = 1 m^0 = 1 m0=1 个节点
  2. 设第 i - 1层至多有 m i − 2 m^{i-2} mi2 个节点
  3. 则第 i 层,由于节点的度为 m ,则节点数为 m i − 2 ∗ m = m i − 1 m^{i-2} * m = m^{i-1} mi2m=mi1

性质 3: 高度为 h 的 m 叉树至多有 m h − 1 m − 1 \frac{m^{h}-1}{m-1} m1mh1个节点

节点数最多,则每层都有 m i − 1 m^{i-1} mi1个节点( i ≥ 1 i\geq 1 i1)。则总结点数 n = m 0 + m 1 + m 2 + ⋯ + m h − 1 n=m^0 + m^1 + m^2 + \cdots +m^{h-1} n=m0+m1+m2++mh1,用等比数列求和公式可得 n = m h − 1 m − 1 n=\frac{m^{h}-1}{m-1} n=m1mh1

性质 4 :具有 n 个节点的 m 叉树的最小高度为 ⌈ l o g m ( n ∗ ( m − 1 ) + 1 ) ⌉ \lceil log_m (n*(m-1)+1) \rceil logm(n(m1)+1) (对数意义)

高度最小,则每个节点的度都为 m,即每层都有最多节点。由性质 3 得: n = m h − 1 m − 1 n=\frac{m^h-1}{m-1} n=m1mh1,整理可得: m h − 1 = n ∗ ( m − 1 ) ⟹ h = l o g m ( n ∗ ( m − 1 ) + 1 ) m^h-1=n*(m-1)\Longrightarrow h=log_m (n*(m-1)+1) mh1=n(m1)h=logm(n(m1)+1)
由于多余节点也是一层,所以需要向上取整,所以 h = ⌈ l o g m ( n ∗ ( m − 1 ) + 1 ) ⌉ h=\lceil log_m (n*(m-1)+1) \rceil h=logm(n(m1)+1)

性质 5 :满m叉树节点编号为 i 的第 k 个孩子节点编号为 ( i − 1 ) ∗ m + k + 1 ( 1 ≤ k ≤ m ) (i-1)*m+k+1(1\leq k\leq m) (i1)m+k+11km)

设节点 i 为该 m 叉树的第 h 层(h=1,2,3…),
前 h-1 层层共有 N 1 = m h − 1 − 1 m − 1 N_1=\frac{m^{h-1}-1}{m-1} N1=m1mh11(树的基本性质3)个节点,
前 h 层共有 N 2 = m h − 1 m − 1 N_2=\frac{m^h-1}{m-1} N2=m1mh1(树的基本性质3)个节点,
显然,i 为第 h 层的第 i − N 1 i-N_1 iN1个节点,
⟹ \Longrightarrow i 有 i − N 1 − 1 i-N_1-1 iN11个左兄弟,
⟹ \Longrightarrow 节点 i 的第一个孩子 j 有 ( i − N 1 − 1 ) ∗ m (i-N_1-1)*m (iN11)m个左兄弟,
⟹ \Longrightarrow 节点 i 的第一个孩子 j 在第 h+1 层的次序为 ( i − N 1 − 1 ) ∗ m + 1 (i-N_1-1)*m+1 (iN11)m+1
⟹ \Longrightarrow 节点 i 的第一个孩子 j 在树中的编号为 N 2 + ( i − N 1 − 1 ) ∗ m + 1 N_2+(i-N_1-1)*m+1 N2+(iN11)m+1
{ N 2 = m h − 1 m − 1 j = N 2 + ( i − N 1 − 1 ) ∗ m + 1 \begin{cases} N_2=\frac{m^h-1}{m-1} \\ j = N_2+(i-N_1-1)*m+1 \end{cases} {N2=m1mh1j=N2+(iN11)m+1

⟹ 节 点 i 的 第 一 个 孩 子 j = ( i − 1 ) ∗ m + 2 \Longrightarrow 节点 i 的第一个孩子 j=(i-1)*m+2 ij=(i1)m+2
树为m叉树
⟹ 节 点 i 的 最 后 一 个 孩 子 j = ( i − 1 ) ∗ m + 2 + m − 1 = ( i − 1 ) ∗ m + m + 1 \Longrightarrow 节点 i 的最后一个孩子 j=(i-1)*m+2+m-1=(i-1)*m+m+1 ij=(i1)m+2+m1=(i1)m+m+1
⟹ \Longrightarrow 编号为 i 的节点的孩子节点编号 ( i − 1 ) ∗ m + k + 1 ( 1 ≤ k ≤ m ) (i-1)*m+k+1(1\leq k\leq m) (i1)m+k+11km)

性质 6 :满m叉树孩子节点编号为 j 的双亲节点编号 i = ⌊ ( j − 2 ) / m ⌋ + 1 i=\lfloor(j-2)/m \rfloor +1 i=(j2)/m+1

由树的基本性质5,节点 i 的第一个孩子 j = ( i − 1 ) ∗ m + 2 j=(i-1)*m+2 j=(i1)m+2
⟹ i = ⌊ ( j − 2 ) / m ⌋ + 1 \Longrightarrow i=\lfloor(j-2)/m \rfloor +1 i=(j2)/m+1

2 二叉树的基本性质

在这里插入图片描述

性质 1 :非空二叉树的叶子节点数等于度为 2 的节点数加1 ,即 n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1

设度为0、1、2的节点个数为 n 0 , n 1 , n 2 n_0,n_1,n_2 n0,n1,n2,则节点总数 n = n 0 + n 1 + n 2 n=n_0+n_1+n_2 n=n0+n1+n2
设B为分支总数,则 n = B + 1 n=B+1 n=B+1,由于这些分支是度为1和度为2的节点射出的,所以 B = n 1 + 2 n 2 B=n_1+2n_2 B=n1+2n2
{ n = n 0 + n 1 + n 2 n = B + 1 B = n 1 + 2 n 2 \begin{cases} n=n_0+n_1+n_2 \\ n=B+1 \\ B=n_1+2n_2 \\ \end{cases} n=n0+n1+n2n=B+1B=n1+2n2
⟹ n 0 = n 2 + 1 \Longrightarrow n_0=n_2+1 n0=n2+1

性质 2 :非空二叉树第 k 层至多有 2 k − 1 2^{k-1} 2k1个节点( k ≥ 1 k\geq 1 k1)

由树的基本性质2,取树的度m=2

性质 3 :高度为 h 的二叉树至多有 2 h − 1 2^h-1 2h1个节点( h ≥ 1 h\geq 1 h1)

由树的基本性质3,取树的度m=2

性质 4 :完全二叉树的性质(完全二叉树的定义)

  1. i > 1 i > 1 i>1时,节点 i i i 的双亲编号为 ⌊ i / 2 ⌋ \lfloor i/2 \rfloor i/2。即:
    i i i 为偶数,双亲编号为 i / 2 i/2 i/2
    i i i 为奇数,双亲编号为 ( i − 1 ) / 2 (i-1)/2 (i1)/2
  2. 2 i ≤ n 2i \leq n 2in时,节点 i i i 的左孩子编号为 2 i 2i 2i ,否则无左孩子
  3. 2 i + 1 ≤ n 2i+1 \leq n 2i+1n时,节点 i i i 的右孩子编号为 2 i + 1 2i+1 2i+1 ,否则无右孩子
  4. 节点 i i i 的层次深度为 ⌊ l o g 2 i ⌋ + 1 \lfloor log_2i \rfloor + 1 log2i+1(证明:下述性质5)

性质 5 :具有n个节点的完全二叉树的高度为 ⌊ l o g 2 n ⌋ + 1 \lfloor log_2n \rfloor + 1 log2n+1 ⌈ l o g 2 ( n + 1 ) ⌉ \lceil log_2 (n+1) \rceil log2(n+1)

证明1:

由二叉树性质3和完全二叉树的定义有
2 h − 1 − 1 < n ≤ 2 h − 1 或 2 h − 1 ≤ n < 2 h 2^{h-1}-1\lt n\leq 2^{h}-1 或 2^{h-1}\leq n\lt 2^{h} 2h11<n2h12h1n<2h
解得: h = ⌊ l o g 2 n ⌋ + 1 或 h = ⌈ l o g 2 ( n + 1 ) ⌉ h= \lfloor log_2n \rfloor + 1或h= \lceil log_2 (n+1)\rceil h=log2n+1h=log2(n+1)

证明2:

由二叉树性质3得, n = 2 h − 1 ( h ≥ 1 ) n=2^{h}-1 (h\geq 1) n=2h1h1)

⟹ n + 1 = 2 h ⟹ h = l o g 2 ( n + 1 ) ⟹ h = ⌈ l o g 2 ( n + 1 ) ⌉ \Longrightarrow n+1=2^{h} \Longrightarrow h=log_2(n+1) \Longrightarrow h= \lceil log_2 (n+1)\rceil n+1=2hh=log2(n+1)h=log2(n+1)


对数

对数是由数学家约翰·纳皮尔(1550-1617)发明。在中学数学中,我们先是学习了指数,比如 2 3 = 8 2^3=8 23=8。然后,我们才学习了指数的逆运算——对数,比如求出2的多少次方才会等于8,我们可以用对数来表示这个数,即 l o g 2 ( 8 ) log_2(8) log2(8),其结果就是 l o g 2 ( 8 ) = 3 log_2(8)=3 log2(8)=3。我们用更一般的表达式来表示指数函数 y = a x y=a^x y=ax,写成对数形式 x = l o g a ( y ) x=log_a(y) x=loga(y)(这里需要满足a>0,且a≠1)。因此,指数和对数互为逆运算。

然而,在历史上,对数函数其实先出现,后来才出现指数函数。这是因为对数发明的初衷并不是用于求解指数的幂,而是用于求解多个数的连乘之积。当时,随着科学技术的发展,人们在计算过程中所用到的数字随之越来越大。由于没有计算器的帮助,想要算出几个很大数字的乘积,往往需要耗费大量的时间。对数的出现大大减少了计算乘积所需的工作量,这得益于对数的独特性质: l o g a ( b c ) = l o g a ( b ) + l o g a ( c ) , l o g a ( b ) = l o g c ( b ) / l o g c ( a ) , l o g a ( b c ) = c l o g a ( b ) log_a(bc)=log_a(b)+log_a(c),log_a(b)=log_c(b)/log_c(a),log_a(b^c)=clog_a(b) loga(bc)=loga(b)+loga(c)loga(b)=logc(b)/logc(a)loga(bc)=cloga(b)等等。只要通过查对数表,就能很快计算出一些较为繁琐的运算。例如,我们想要计算567.89和3141.59的乘积。假设:

x = 567.89 × 3141.59 x=567.89×3141.59 x=567.89×3141.59

两边同时取以10为底的对数,得到:

l o g 10 ( x ) = l o g 10 ( 567.89 × 3141.59 ) = l o g 10 ( 567.89 ) + l o g 10 ( 3141.59 ) log_{10}(x)=log_{10}(567.89×3141.59)=log_{10}(567.89)+log_{10}(3141.59) log10(x)=log10(567.89×3141.59)=log10(567.89)+log10(3141.59)

l o g 10 ( x ) = l o g 10 ( 1 0 2 × 5.6789 ) + l o g 10 ( 1 0 3 × 3.14159 ) log_{10}(x)=log_{10}(10^2×5.6789)+log_{10}(10^3×3.14159) log10(x)=log10(102×5.6789)+log10(103×3.14159)

l o g 10 ( x ) = 2 + l o g 10 ( 5.6789 ) + 3 + l o g 10 ( 3.14159 ) = 5 + l o g 10 ( 5.6789 ) + l o g 10 ( 3.14159 ) log_{10}(x)=2+log_{10}(5.6789)+3+log_{10}(3.14159)=5+log_{10}(5.6789)+log_{10}(3.14159) log10(x)=2+log10(5.6789)+3+log10(3.14159)=5+log10(5.6789)+log10(3.14159)

其中 l o g 10 ( 5.6789 ) log_{10}(5.6789) log10(5.6789) l o g 10 ( 3.14159 ) log_{10}(3.14159) log10(3.14159)可以在对数表中查出,把它们相加之后,再查反对数就能得到最终结果。在没有电子计算器的时代,通过对数计算一些繁琐的运算可以大大减轻计算量。

完全二叉树

完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/hw2xWeeE.shtml

相关文章

【数据结构】二叉树的概念 | 满二叉树和完全二叉树 | 二叉树的基本性质

前言&#xff1a; 在上一章中我们正式开启了对数据结构中树的讲解&#xff0c;介绍了树的基础。本章我们将学习二叉树的概念&#xff0c;介绍满二叉树和完全二叉树的定义&#xff0c;并对二叉树的基本性质进行一个简单的介绍。本章附带课后练习。 &#x1f517; 链接&#xf…

树与二叉树基本概念与性质

树的基本概念 基本概念 树的度—— 一棵树中最大的结点度数 双亲—— 孩子结点的上层结点叫该结点的双亲 兄弟—— 同一双亲的孩子之间互成为兄弟 祖先—— 结点的祖先是从根到该结点所经分支上的所有结点 子孙—— 以某结点为根的子树中的任一结点都成为该结点的子孙 结…

【数据结构】 树与二叉树的基本概念、结构特点及性质

前言&#xff1a;本章内容主要是数据结构中树与二叉树的基本概念、结构特点及性质的引入。 文章目录 树的概念树的特点&#xff1a;树的常用术语&#xff1a;树的表示&#xff1a;代码创建&#xff1a; 树在实际中的应用&#xff1a; 二叉树的概念特殊的二叉树满二叉树完全二叉…

二叉树的基本性质

一、二叉树的定义&#xff1a; 二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”&#xff08;right subtree&#xff09;。二叉树常被用于实现二叉查找树和二叉堆。 如图所示为一颗二叉树&#xff1a; ​ 二、二叉树的基本性质&#xff1a; 1、…

B+树叶子结点到底存储了什么?

首先MYSQL默认InnoDB引擎&#xff0c;该引擎默认B树&#xff1b;先说结论&#xff1a;B树叶子结点存储的是主键KEY或者具体数据。分情况讨论&#xff1a; 主键KEY 比如说user_name是个索引&#xff0c;当执行该SQL&#xff1a;select * from user_info where user_name xiao…

二叉树叶子结点,非叶子节点以及深度的计算

二叉树叶子结点的计算 //统计叶子结点的数目 int LeafNum(BiTree T) {if (!T) {return 0;} else if (!T->lchild && !T->rchild) {return 1;} else {return LeafNum(T->lchild) LeafNum(T->rchild);} }二叉树非叶子节点的计算 //统计非叶子结点的数目 i…

叶子结点

叶子结点 叶子结点是离散数学当中的概念。一棵树当中没有子结点&#xff08;即度为0&#xff09;的结点&#xff0c;称为叶子结点&#xff0c;简称“叶子”。 叶子是指度为0的结点&#xff0c;又称为终端结点。 叶子结点 就是度为0的结点 就是没有子结点的结点 n0&#xff1a;…

Pytorch 叶子张量 leaf tensor (叶子节点) (detach)

在Pytorch中&#xff0c;默认情况下&#xff0c;非叶节点的梯度值在反向传播过程中使用完后就会被清除&#xff0c;不会被保留。只有叶节点的梯度值能够被保留下来。 对于任意一个张量来说&#xff0c;我们可以用 tensor.is_leaf 来判断它是否是叶子张量&#xff08;leaf tenso…

Pytorch学习笔记(一)——自动求导和叶子节点

一、什么是叶子节点 PyTorch中的张量tensor有一个属性是is_leaf&#xff0c;当is_leaf为True时&#xff0c;改tensor是叶子张量&#xff0c;也叫叶子节点。 二、叶子节点的作用 PyTorch有自动求导的功能&#xff0c; 当requires_gradTrue时&#xff0c;PyTorch会自动记录运算…

数据结构-树:根节点、子节点、叶子节点是什么?

前言&#xff1a;这个属于数据结构&#xff1a;树。 下面给个例子图解释&#xff08;根节点、子节点、叶子节点&#xff09;。 上图数字 1、3、7是叶子节点&#xff1b;&#xff08;因为他们下面没有分叉出子节点&#xff0c;所以称为&#xff1a;叶子节点&#xff09;【度为0】…

数据结构 - 树

树 &#xff08;1&#xff09;相关概念 兄弟节点&#xff1a;节点的父节点是同一个节点&#xff0c;所以它们之间互称为兄弟节点。 根节点&#xff1a;没有父节点的节点叫作根节点 叶子节点&#xff1a;没有子节点的节点叫作叶子节点或者叶节点。 节点的高度&#xff1a;节…

根节点、子节点、叶子节点是什么?

前言&#xff1a;这个属于数据结构&#xff1a;树。 下面给个例子图解释&#xff08;根节点、子节点、叶子节点&#xff09;。 上图数字 1、3、7是叶子节点&#xff1b;&#xff08;因为他们下面没有分叉出子节点&#xff0c;所以称为&#xff1a;叶子节点&#xff09;【度为0】…

弱网、2G、3G、4G测试

1.各项指标 教程指引&#xff1a;弱网测试教程 2.概念介绍 Bandwidth&#xff08;带宽&#xff09;、Utilistation&#xff08;利用百分比&#xff09;、Round-trip&#xff08;往返延迟&#xff09;、MTU&#xff08;最大传输单元&#xff09; 3G&#xff1a;300k-2Mbps左…

简单实用Chrome 日常开发功能详解,帮助你上班摸鱼

chrome是目前开发过程中一骑绝尘的浏览器&#xff0c;占有绝对领导地位。其强大的功能和生态圈&#xff0c;让很多开发者爱不释手。但很多的开发者使用chrome还是停留在F12打开控制台查看log、检查元素或者debug打断点阶段&#xff0c;其实chrome的强大的功能远远超过我们的想象…

小米路由器3G如何解决USB3.0 5G WiFi速度慢的问题

经常玩电脑&#xff0c;希望家里有个轻 nas&#xff0c;小米路由器是一个不错的选择&#xff0c;tbw买了一个小米路由器3G看重的是快速的速度&#xff08;usb3.0 5G Wifi&#xff09;&#xff0c;及小米的可拓展性&#xff0c;使用usb3.0的usb接口&#xff0c;且使用5gb网速&am…

浏览器通过f12来限制网速

浏览器可以使用F12开发者工具来模拟网速的快慢。 打开需要测试的网站&#xff0c;点击F12&#xff0c;再点击选项里的network-no throttling&#xff0c;展示的有几种&#xff0c;offline&#xff0c;快3g&#xff0c;慢3g&#xff0c;或者自定义 点击add可以自定义网速&#…

移动网速测试软件,网速测试大师APP

网速测试大师APP是一款专业的手机网络测试应用&#xff0c;支持一键测速&#xff0c;精准快速&#xff0c;还能全方位分析网速&#xff0c;Wifi和移动网络全检测&#xff0c;30秒测速当前网络状况&#xff0c;做随时随地的测速专家。 该软件整个测速过程精准又快速&#xff0c;…

android 显示网速,随着掌握联网状态 Android手机如何显示实时网速

很多时候手机信号栏明明显示正在联网而且图标也显示正在下载上传中&#xff0c;但就是打不开网页。实际上&#xff0c;此时可能正处于4G→3G切换状态而出现了短暂的断网。那么&#xff0c;如何才能准确掌握手机当前的联网状态呢&#xff1f; 答案很简单&#xff0c;就是通过手机…

Fiddler工具的弱网模拟2G/3G/4G

日常测试工作中&#xff0c;C端用户会因信号和设备网络原因&#xff0c;出现一些恶劣网络的状态&#xff0c;然后出现奇奇怪怪的丢包、重传、UI空白、UI绘制异常等问题&#xff0c;就需要测试人员去模拟这类弱网环境去重现用户反馈的问题&#xff0c;以方便开发同学解决和调优加…