完全二叉树和满二叉树

在排序算法中有一种叫做堆排序的方法,堆一般是用完全二叉树实现,所以记录下完全二叉树和满二叉树

完全二叉树:若设二叉树的深度为h,除第h层外,其他各层(1~h-1)的节点数都达到最大个数,第h层所有节点都连续集中在最左边,这就是完全二叉树

满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。满二叉树一定是完全二叉树,不同的是最后一层的所有节点都有两个字节点。

完全二叉树和满二叉树
图片来源:https://blog.****.net/njdragonfly/article/details/6373199

完全二叉树的特点:

性质1 :总层数为n,第i(0<i<n)i(0<i<n)层上节点个数为2i12^{i-1},第n层的叶子节点最多为 2n12^{n-1}

证明:
  (1)第一层的节点个数为202^{0};
  (2)第二层的节点个数为212^{1};
  (3)第ii层的节点个数为2i12^{i-1};
  (4)最后一层叶子节点最多为2n12^{n-1}(满二叉树);

性质2: 深度为n的二叉树,最多有2n-1:
证明:
  假设第i层的节点数为X i,则
i=0nXi<=i=0n2i1=2n1\sum_{i=0}^{n}X_{i} <= \sum_{i=0}^{n}2^{i-1}=2^{n}-1

性质3:对于非空的二叉树,如果叶子节点数为n0n_{0},度为2的节点数为n2n_{2},度为1的节点数为n1n_{1},z则有n0=n2+1n_{0} = n_{2} + 1
证明:
  设NN为二叉树的节点总数,则有N=n0+n1+n2N = n_{0} + n_{1} + n_{2}.另一方面,除根节点之外,其余所有节点有唯一的一个进入分支。设BB为二叉树的分支数,那么:B=N1B = N-1,这些分支是由度为1和度为2的节点发出的,所以:B=n1+2n2B = n_{1} + 2*n{2},综上所述:
n0=n2+1n_{0} = n_{2} + 1

性质4: 具有NN个节点的完全二叉树的深度为kk[log2n]+1[\log_{2}^{n}]+1
证明:
  假设一颗完全二叉树的深度为kk,节点个数为NN,则有:
2k11<N2k12^{k-1}-1<N\leq2^{k}-1
  即:
2k1N<2k2^{k-1} \leq N<2^{k}
  同时取对数:
k1log2N<kk-1 \leq \log_{2}^{N} < k
  所以kk的 取值为:[log2n]+1[\log_{2}^{n}]+1

性质5:
对于具有 N 个节点的完全二叉树,如果按照从上至下和从左到右的顺序
对二叉树中的所有节点从 1 开始顺序编号,则对于任意的序号为 ii
节点,有,
(1) 如果 $ i> 1$ 则序号为 ii 的节点的双亲节点的序号为i/2i/2 如果 i = 1则序号为 ii 的节点是根节点, 无双亲节点;
(2) 如果 2iN2i \leq N 则序号为 i 的节点的左孩子节点的序号为 2i2i 如果2i>N2i > N 则序号为 ii 的节点无左孩子;
(3) 如果 2i+1N2i+1 \leq N,则序号为 ii 的节点的右孩子节点的序号为2i+12i+1,如果 2i+1>N2i+1 > N,则序号为ii的节点无右孩子;