在之前的博客中,我们已经掌握了使用辅助队列来实现二叉树层次遍历的算法.
既然是"遍历",那么二叉树中的每个结点在一次操作中都会被访问到:基于此,我们对遍历时的操作稍加修改,便可统计二叉树中度为1的结点的个数.
(※)这里再说明一下判断结点度是否为1的方法:如果某结点的左孩子为空且右孩子不空或左孩子不空且右孩子为空,那么该结点的度就为1. 根据分析,我们可以得出判断条件:
temp->LChild==NULL&&temp->RChild!=NULL||temp->LChild!=NULL&&temp->RChild==NULL)
根据上面的分析,下面给出算法实现.
int sum_1_LevelTraverse=0;//记录度为1的结点的个数
void NodeCount_1_LevelTraverse(BiTreeNode* &T)//用层次遍历的方法统计度为1的结点的个数
{
BiTreeNode* temp;
if(T==NULL)//如果main()函数传来的T指针为NULL
{
//说明所给二叉树的根结点指针为NULL
//也即二叉树是空树
//则直接返回main()函数
return ;
}
EnQueue(Q,T);//将二叉树根节点入队列
while(QueueEmpty(Q)==false)//只要队列不空, 就继续循环
{
temp=DeQueue(Q);//temp记录出队指针
if(temp->LChild==NULL&&temp->RChild!=NULL||temp->LChild!=NULL&&temp->RChild==NULL)//判断访问结点的度是否为1
{
sum_1_LevelTraverse++;
}
if(temp->LChild!=NULL)//如果存在左孩子
{
//左孩子指针进队列
EnQueue(Q,temp->LChild);
}
if(temp->RChild!=NULL)//如果存在右孩子
{
//右孩子指针进队列
EnQueue(Q,temp->RChild);
}
}
}
从上面算法的设计流程来看,我们在学习数据结构这门课时,不要总想着自己"凭空"设计出解决问题的算法,而是应该尽力将未知问题往已知问题上转化,再用已知求解方法作为该未知问题求解方法的基础,之后结合未知问题的实际情况,对已知求解方法稍加修改——如此一来,便可高效地完成算法设计.