常见二叉树区别:
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
满二叉树的层k与结点个数的关系:
//第一层2^0
//第二层2^1
//第三层2^2
//第k层2^(k-1)
根据等比数列求和公式求得前k层所有节点的个数sum
sum=1+2^1+2^2+2^3+...+2^(k-1)=2^k-1
假设用数组存储满二叉树,从下标为0的位值开始存第一个根节点然后依次是它的左右子树,如此循环,那么第k层的最后一个节点下标为:2^k-2
公式描述:
公式中a1为首项,an为数列第n项,q为等比数列公比,Sn为前n项和
//总结一下:共2^k-1个节点,每层有2^(k-1)个节点
上面说了满二叉树现在来说完全二叉树
完全二叉树子节点下标与父结点下标关系证明:
假设父节点为第K层的第m个节点,则其子节点为k+1层的第2m-1个 和 第2*m个(自己可以画图试试
//证明也很简单:
//设父节点为F,F有两个子节点S1和S2
//节点F为第k层的第m个,所以F前肯定有m-1个节点(在第k层
//因为是完全二叉树所以S1前肯定有2(m-1)个节点所以S1是第2m-1个
//S2肯定是第2m个了
则父节点下标为2^(k)-2+m,子节点下标为2^(k+1)+2m-3 和2^(k+1)+2m-2(不要忘了上面的证明,第k层最后一个节点的下标为2^k-2)
//很明显父节点坐标与子节点坐标关系:
//son_index1=2×father_index+1
//son_index2=2×father_index+2
//father_index=son_index/2(前提 father_index和on_index都是int类型
建议:以后记住这个关系就行,不要每次遇到就强迫症似的非得在大脑证明一遍,浪费时间
建堆的时候总是从倒数第二排最后一个节点开始建,说的比较高级些就是从最后一个非叶节点开始建,然后就比较容易看到for(i=size/2-1;i>0;i--)