您的位置:首页 > 理论基础 > 数据结构算法

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

2018-03-31 22:26 711 查看
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)已经不会更新,等待front移动到rear汇合,此时退出
p=Q[++front];//读入队列中一个结点
if(p->lchild!=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(front<rear){//假设队列已经初始化完成了
GetHead(Q,p);
if(p->lchild!=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(front<rear){//最后一个节点时rear(或者说last)已经不会更新,等待front移动到rear汇合,此时退出
p=Q[++front];//读入队列中一个结点
if(p->lchild!=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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐