vlambda博客
学习文章列表

算法笔记-3:完美、完全、完满的二叉树分别是啥?

        上期的最后,我们提到了完全n-树的概念(来自《离散数学结构》)。

图1-完全n-树的概念


        我在写二叉堆笔记的时候,知道了二叉堆是一棵完全二叉树,但是我以为这里的完全二元树就是完全二叉树。

        但后来我发现有点不对,堆结构要求新加入的元素在最大层从左至右排列,直到占满该层后才能新增一层。

算法笔记-3:完美、完全、完满的二叉树分别是啥?

图2-典型的堆结构


        显然,堆结构可能会出现最后一个节点是某个节点的唯一子节点的情况。而完全二元树要求每个节点若有子节点,那么必须要有两个;对于是不是每层空间都利用上了,都占满了;还有最后一层是不是从左到右紧密排列的,这些都不关心。

        如下也是一棵完全二元树:

算法笔记-3:完美、完全、完满的二叉树分别是啥?

  图3-典型的完全二元树结构


        这可真是神奇,二叉树虽然是二元树,但是完全二元树并不等价于完全二叉树?

算法笔记-3:完美、完全、完满的二叉树分别是啥?




        后来我找了一篇文章,解答了我的疑惑。

完美二叉树, 完全二叉树和完满二叉树

https://blog.csdn.net/qq_22642239/article/details/80774013

        在计算机科学领域,为了适应计算机本身的特性。在树结构的基础上提出了一些扩展概念,其中包括二叉树/二杈树。二叉树除了是一棵二元树之外,还要求其明确左右子节点。也就是说,二叉树是一棵有序二元树。

        接下来的就是本期的重点了




一、完美二叉树(Perfect Binary Tree)


算法笔记-3:完美、完全、完满的二叉树分别是啥?

图4-完美二叉树

        一棵高度为k(≥0),有2^(k+1)-1个节点的二叉树被称为完美二叉树。从图像上来看,完美二杈树的每一层都充满了节点。因此也有人把它叫满二叉树。但你必须要分清楚,满二叉树不是指完满二叉树,而是指完美二叉树;它代表种树过程中的一种理想情况。




二、完全二叉树(Complete Binary Tree)

算法笔记-3:完美、完全、完满的二叉树分别是啥?

图5-完全二叉树

        如果从根节点到倒数第二层都符合完美二叉树的要求,最后一层可以不充满,但是所有叶子节点向左靠齐,那么就是一棵完全二叉树。

        叶子向左靠齐,这样就能保证新节点有序地加入,且占满了最后一层才开启下一层。




三、完满二叉树(Full Binary Tree)

        

算法笔记-3:完美、完全、完满的二叉树分别是啥?

图6-完满二叉树

        完满二叉树所有非叶子节点都有两个子节点。这就与完全二元树的定义一致了。

        我不清楚是谁规定的,反正就是这么规定了……




图7-三树PK

        比较三种类型的树,我们不难发现:

        1、完美二叉树是另外两者的理想情况。一棵完美二叉树,必定是完全的和完满的,但反过来就不一定成立。

        2、完全二叉树可能是完满的,也可能不是完满的,反过来说也是如此。

        

        如果实在记不住三种树,那么至少要记住完全二叉树是什么。因为下期要介绍的二叉堆概念就与之密切相关。有什么问题欢迎在留言区里提问哦!