1.计算层数
主体思路是用队列构建层次遍历。
设计一个last用来标记front正在移动的当前层的最后一个结点,level来标记层数(计数器)
因为rear肯定先于front进入下一层进行结点添加,front能够来到这层时,就说明rear早已把这一层结点铺完,现在正在front的下一层,因此找到一个时机在rear铺完该层的最后一个结点时令last=rear,把最后结点标记的这一操作是可行的。
这个时机就是:当front=当前层last(旧的last)时,说明下一层(rear正在铺设的那层)刚好铺完,此时把rear正在它那层的尾结点,于是更新last,令last=rear。只要这个操作从根结点就开始做,就能保证front在每层运行时能知道自己是不是到尾结点了,当front==last时即到达本层尾结点,让level++记录层数。
int Btdepth(BiTree T){
if(!T)
return 0;//如果空表,返回0层
BiTree Q[MaxiSize];//该数组实际上表示队列,注意是BiTree指针型数组,本来就是用来存指针的
int front=-1,rear=-1;//Q[front]中f值的增减实际上就是指针在队列上的移动
int last=0,level=0;//last表示每层最后一个结点对应在数组Q中的号,初始为根结点Q[0]。level从0层开始计
Q[++rear]=T;//根结点入队
BiTree p;
while(front<rear){//最后一个节点时rear(或者说last)已经不会更新&