完全二叉树和满二叉树的区别+完全二叉树求节点问题

今天复习了下二叉树的相关知识,发现很多都忘掉了,所以在此记录下

满二叉树

《完全二叉树和满二叉树的区别+完全二叉树求节点问题》
如图,顾名思义,满二叉树说白了其实就是除了最后一层,所有节点都有两个孩子,
所以:
假设现在有一棵深度为N的满二叉树:
总结点数就是2^N-1(计算公式:2^0 + 2^1 +…+2^(N-1))
叶子节点数就是2^(N-1)(上图中叶子节点也就是第三层的节点数位2^2 = 4)

完全二叉树

《完全二叉树和满二叉树的区别+完全二叉树求节点问题》
如图,完全二叉树就是除了最后一排,其余的都是满二叉树,最后一排的节点都连续靠左。
所以:
如果给定了一个完全二叉树的总结点数,那么对应应该可以求出他的叶子节点数已经深度。
例如:总结点数位770,求叶子节点

方法一:(详细步骤)

如下:
2^9 – 1 = 511 < 770
2^10 – 1 = 1023 >770
所以 这个完全二叉树一共有10层;前9层总结点是511,所以第10层的叶子节点为770 – 511 = 259,
*特别注意*
因为最后一层不是满的,所以倒数第二层也露出了一些节点,那些节点也算是叶子节点!
第9层总结点数为 2*(9-1) = 256,
第10层一共259个叶子节点,他们的父节点是在第9层的,也就是round(259/2)(向上取整 = 130)这么多个第9层节点延伸下来的,也就是第9层这些节点是有孩子的,剩下的256 – 130 = 126没有孩子,也是算叶子节点的。
所以总共 126 + 259 = 385个叶子节点。

方法二(简便算法)

如下:
首先了解下定义:
有两个子节点的节点叫做度数为2的节点,这里称作D2
有一个子节点的节点叫做度数为1的节点,这里称作D1
有0个子节点的节点叫做度数为0的节点,这里称作D0(叶子节点)
于是:
总节点数=D2 + D1 + D0
另外:
D2它会产生两个新节点,D1产生一个新节点,还有一个根节点本身就存在
所以总结点数 = D2 * 2 + D1 * 1 + 1
联合两个方程得到:
D2 + 1 = D0
也就是度数为0的节点数总是比度数为2的节点数多1个
了解这一点很重要!!!

好了,下面开始简单运算过程:
假设总结点数为N,那么就有:
N = D2 + D1 + D0
又因为之前上面提到 D2 + 1 = D0,所以
N = D0 – 1 + D1 + D0
N = 2D0 + D1 – 1

注意:充分了解完全二叉树的定义可知,度为1的节点只有可能为0或者1
所以,D1 = 1 OR 0,两种情况都带入
D1 = 0时:
N = 2D0 – 1
D0 = (N + 1) / 2
D1 = 1时:
N = 2D0
D0 = N / 2
D0是个整数,所以D0 = N / 2(向上取整)

总结:
叶子节点数 = 总结点数 / 2 (向上取整)

    原文作者:满二叉树
    原文地址: https://blog.csdn.net/b491985496/article/details/51199783
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞