二叉树分类很多,其中有满二叉树和完全二叉树,这两种二叉树的效率都很高,但它们之间也有不同,那它们之间的区别是什么呢?
满二叉树
顾名思义,满二叉树指每一层都达到了最大节点数的二叉树,也就是深为 k 且有 2k-1 个节点的二叉树。它可以按从左到右、从上到下的顺序编号,如图 1 所示。
图 1:满二叉树
完全二叉树
在深度为 k 的完全二叉树中,所有的节点也按从左到右、从上到下的顺序编号。每个节点的编号都与深度为 k 的满二叉树中相应位置的节点一一对应。图 2 所示为完全二叉树。
图 2:完全二叉树
正因这样的性质,完全二叉树的叶子节点只出现在最底部的两层,而左右子树的深度要么相等,要么相差 1。同样,可以推出,当完全二叉树有 n 个节点时,它的深度为 ,这里
表示向下取整。
设 k 为完全二叉树的深度,那么:
2k-1-1<n≤2k-1,n为整数
2k-1≤n<2k
k-1≤log2n<k
k=log2n+1
我们还可以观察到,在完全二叉树中,父亲节点和孩子节点的编号有着一定的关系。如图 3 所示,当父亲节点的编号为 i 时,左孩子节点的编号为 2i,右孩子节点的编号为 2i+1。
图 3:节点之间的编号关系
根据这个规律,我们也可以推出,当某个节点的编号为 i 时,它的父亲节点编号为 [i/2]。
在 Python 中,最常见的二叉树存储方法是顺序存储。当把二叉树存储在顺序列表中时,下标即为节点的编号,而元素本身则是节点所存储的数据。比如说,T[2]=3 表示把编号为 2 的节点存储的元素赋值为 3。这时候,我们可以通过上面讲到的父亲孩子节点编号之间的关系来实现遍历等功能。同时,正因为这个性质,根节点在列表中的下标必须大于 0。