【数据结构与算法 C/C++】树/二叉树计算公式总结

本文详细介绍了树的通用计算公式,包括多叉树的结点数、分支数、特定层结点数和高度,以及二叉树的非空性质、边数、最大结点数等。涵盖了满二叉树和完全二叉树的编号规则。是算法工程师必备的树结构知识梳理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.变量说明

  • 度为 mmm 的结点数 = nmn_mnm;
  • iii : 第 iii 层 或 第 iii 号结点;
  • hhh : 树的高度;
  • ceilceilceil 向上取整, floorfloorfloor 向下取整 ;

1. 树的计算公式 (通用)

  1. 总结点数=n0+n1+n2+...+nm=总分支数+1总结点数 =n_0+n_1+n_2+...+n_m = 总分支数 + 1总结点数=n0+n1+n2+...+nm=总分支数+1 ;
  2. 总分支数=1∗n1+2∗n2+...+m∗nm总分支数 = 1*n_1+2*n_2+...+m*n_m总分支数=1n1+2n2+...+mnm ;
  3. 度为 mmm 的树的第 iii 层上最多mi−1m^{i-1}mi1 个结点 (i≥1)(i\ge1)(i1) ;
  4. 高度为 hhhmmm 叉树最多mh−1/m−1m^h-1/m-1mh1/m1 个结点;
  5. 具有 nnn 个结点的 mmm 叉树的最小高度为 ceil(logm(n(m−1)+1))ceil (log_m(n(m-1)+1))ceil(logm(n(m1)+1)) ;

2. 二叉树计算公式

  1. 非空二叉树中 n0=n2+1n_0 = n_2+1n0=n2+1 ;
  2. 非空二叉树中 结点数为 nnn时, 边数=n−1边数=n-1边数=n1 ;
  3. 高为 hhh 的二叉树 最多2h−12^{h-1}2h1 个结点 ;

3. 满二叉树计算公式

  1. 编号问题 : 编号为 iii 的结点
    • 双亲为 floor(i/2)floor(i / 2)floor(i/2)
    • 左孩子编号为 2i2i2i ;
    • 右孩子编号为 2i+12i+12i+1

4. 完全二叉树计算公式

  1. 编号问题 : 编号为 i 的结点 :
    • i≤floor(n/2)i\le floor(n/2)ifloor(n/2) 则 i 为分支结点, 否则 i 就是叶子结点
    • 按层编号, 当编号为 i 的结点为 叶子结点或只含左子节点 , 则编号大于 i 的都是叶子结点;
    • 总结点数为奇数, 每个分支节点都要左右子结点;
    • 总结点数为偶数, 编号最大者(i=n/2i=n/2i=n/2) 只有左子节点;
    • n个结点的完全二叉树的高度为 h=ceil(log2(n+1))h=ceil(log_2(n+1))h=ceil(log2(n+1))h=floor(log2n)+1h=floor(log_2n)+1h=floor(log2n)+1;
    • 若某节点编号为 i :
      • 2i≤n2i\le n2in i的左子节点编号为 2i2i2i, 否则就是没有左子节点;
      • 2i+1≤n2i+1\le n2i+1n i的右子节点编号为 2i+12i+12i+1, 否则就是没有右子节点;
      • 最后一个分支结点的编号为 floor(n/2)floor(n/2)floor(n/2) ;
### 关于二叉树节点数量计算公式的解析 在数据结构中,二叉树是一种重要的非线性数据结构。对于二叉树的节点数量计算公式,可以从以下几个方面进行分析: #### 节点总数度的关系 设 $ N $ 表示二叉树中的总节点数,$ n_0 $ 表示度为 0 的节点(即叶子节点),$ n_1 $ 表示度为 1 的节点,$ n_2 $ 表示度为 2 的节点,则满足以下关系: $$ N = n_0 + n_1 + n_2 $$ 此外,还存在另一个重要性质:**度为 0 的叶子节点比度为 2 的节点数多一个**,即: $$ n_0 = n_2 + 1 $$ 通过这两个公式可以推导出其他形式的表达式。 --- #### 完全二叉树的深度节点数关系 对于具有 $ n $ 个节点的完全二叉树,其深度可以通过对数函数表示为: $$ \text{深度} = \lfloor \log_2{n} \rfloor + 1 $$ 这表明完全二叉树的高度其节点数之间存在紧密联系[^2]。 --- #### 不同形态二叉树的数量 当给定 $ n $ 个节点时,能够构造的不同二叉树数量由 **Catalan 数** 给出,具体公式如下: $$ C_n = \frac{(2n)!}{(n+1)! \cdot n!} $$ 这一结果来源于组合数学理论,用于描述固定节点数下可能存在的不同二叉树结构种类[^1]。 --- #### 示例代码实现 以下是基于 Python 实现的一个简单程序来验证上述部分公式: ```python from math import comb, factorial def catalan_number(n): """ 计算第 n 项卡特兰数 """ return factorial(2 * n) // (factorial(n + 1) * factorial(n)) def total_nodes_from_leaves(leaves_count): """ 已知叶子节点数,求总的节点数 """ internal_nodes = leaves_count - 1 return internal_nodes + leaves_count # 测试催化数计算 print(f"Catalan Number C5: {catalan_number(5)}") # 输出第5项卡塔兰数 # 测试已知叶子节点求数量 leaves = 4 total = total_nodes_from_leaves(leaves) print(f"Total nodes with {leaves} leaf nodes: {total}") ``` --- #### 总结 以上介绍了关于二叉树节点数量的主要计算方法及其相关特性。这些公式不仅适用于普通二叉树,也广泛应用于特殊类型的二叉树如满二叉树、完全二叉树以及平衡二叉树等场景之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值