1、关于这个问题,是在做推排序初始建立大(小)顶堆时引出的。因为要从最后一个非叶子节点开始往上建立初始大顶堆,所以我思考如何确定最后一个非叶子节点的位置。首先说明这里的满二叉树,指的是:满足节点的度(出度)要么为2,要么为0的树。即一个结点要么有两个子节点,要么没有子节点。

2、给定一个数组,例[4, 6, 8, 5, 9],这棵树的结构应该是第一层为4,第二层为6和8挂在4下面,第三层为5和9挂在6下面。那么如何知道最后一个非叶子节点的位置呢?

3、我们要用到满二叉树的性质:满二叉树所有的节点,其度(出度)要么为2,要么为0。

然后开始推导:假设非叶子节点的个数是x,叶子节点的个数是y,总共节点数是x+y。由于所有非叶子节点的度都是2,所有叶子节点的度都是0,那么总的度为2*x。同时我们知道,一棵有n个节点的树,其度为n-1(除根节点外的每个节点都有1个入度)。所以2*x=n-1=x+y-1,即x=y-1。说明非叶子节点的个数一定比叶子节点的个数少1,节点总数一定是x+x+1=2*x+1,是一个奇数。

放到程序里面看,假如树的节点有5个,则叶子节点有3个,非叶子节点有2个。在上面的数组中,是根据层次遍历的顺序来写的,即从上到下,从左到右。那么从最后一个节点的位置开始往回数,数3个叶子节点后再数一个,就是最后一个非叶子节点。在数组中,最后一个节点的下标是4,最后一个非叶子节点的下标是4-3=1,这个1可以由5/2-1得到。一般的,我们知道节点个数n,就可以知道最后一个非叶子节点的下标为n/2-1。

4、结论:根据层次遍历写出来的满二叉树数组,若数组长度为n,则最后一个非叶子节点的下标为n/2-1。