用层次遍历二叉树的方法统计二叉树中度为1的结点的个数

        在之前的博客中,我们已经掌握了使用辅助队列来实现二叉树层次遍历的算法. 

        既然是"遍历",那么二叉树中的每个结点在一次操作中都会被访问到:基于此,我们对遍历时的操作稍加修改,便可统计二叉树中度为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);
        }
    }
}

        从上面算法的设计流程来看,我们在学习数据结构这门课时,不要总想着自己"凭空"设计出解决问题的算法,而是应该尽力将未知问题往已知问题上转化,再用已知求解方法作为该未知问题求解方法的基础,之后结合未知问题的实际情况,对已知求解方法稍加修改——如此一来,便可高效地完成算法设计.

原创文章 266 获赞 62 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weixin_42048463/article/details/105887851