数据结构学习——计算二叉树的层数&用同一思路计算每层结点个数

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(frontlchild!=NULL)
			Q[++rear]=p->lchild;
		if(p->rchild!=NULL)
			Q[++rear]=p->rchild;
		if(front==last){//此时不仅说明front已经指向该层最后一个节点,还说明下一层已经全部入队完毕可以更新last了
			level++;
			last=rear;
		}
	}//while
	return level;
}
			

此代码中用数组形式展现方便理解

应该也可以直接用函数,下面的代码还没想透,先加上

int Btdepth(BiTree T){
	if(!T)
		return 0;
	InitQueue(Q);
	EnQueue(Q,T);
	BiTree p;
	int level=0,last=0;//此算法last部分还存在疑问,因为此时front并不是数组,怎么和last比较还要再考虑
	while(frontlchild!=NULL)
			EnQueue(Q,p->lchild);
		if(p->rchild!=NULL)
			EeQueue(Q,p->rchild);
		if(front==last){
			level++;
			last=rear;
		}
	}
	return level;
}

2.用上述方法计算每层结点

在上述代码中添加了数组:

int num[LevelMaxsize];

用这个数组来存储每层的结点数目

只要在原先代码中将结点入队的地方加上语句

num[level+1]++;

就可以在每入队一个结点时就在结点那一层的数组中+1记录结点数目,[level+1]保证了正确的层数,+1是因为根结点是[0],一开始不好动?具体看代码

int BtPerLevelNode(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;
	int num[LevelMaxsize];//LevelNmu要人为给定一下,该数组一个元素表示一层的结点数
	num[0]=1;
	while(frontlchild!=NULL){
			Q[++rear]=p->lchild;
			num[level+1]++;
		if(p->rchild!=NULL){
			Q[++rear]=p->rchild;
			num[level+1]++;
		if(front==last){//此时不仅说明front已经指向该层最后一个节点,还说明下一层已经全部入队完毕可以更新last了
			level++;
			last=rear;
		}
	}//while
	return level;
}


你可能感兴趣的:(数据结构学习)