在掌握了二叉树的先序遍历递归算法、中序遍历递归算法和后序遍历递归算法的实现流程后,我们稍微开拓一下视野,来看一下该如何求出二叉树中度为0、度为1和度为2的结点的个数.
在设计算法之前,我们要弄清什么是"结点的度". "结点的度"是指该结点孩子的个数:如果该结点没有孩子,那么该结点的度为0;如果该结点只有左孩子而没有右孩子或只有右孩子而没有左孩子,那么该结点的度为1;如果该结点既有左孩子又有右孩子,那么该结点的度为2.
有了上述概念的铺垫,我们可以使用三种遍历算法中的任意一种作为结构依托,在访问结点时加入和遍历算法不同的操作即可.
下面使用先序遍历递归算法求解二叉树中度为0的结点的个数.
int sum_0=0;//记录二叉树度为0的结点的个数
void NodeCount_0(BiTreeNode* &T)//统计二叉树叶子结点的个数
{
if(T!=NULL)
{
if(T->LChild==NULL&&T->RChild==NULL)//判定结点的度是否为0
{
sum_0++;
}
NodeCount_0(T->LChild);
NodeCount_0(T->RChild);
}
else
{
;
}
}
再使用先序遍历递归算法求解二叉树中度为1的结点的个数.
int sum_1=0;//记录二叉树度为1的结点的个数
void NodeCount_1(BiTreeNode* &T)//统计二叉树度为1的结点的个数
{
if(T!=NULL)
{
if(T->LChild==NULL&&T->RChild!=NULL||T->LChild!=NULL&&T->RChild==NULL)//判定结点的度是否为1
{
sum_1++;
}
NodeCount_1(T->LChild);
NodeCount_1(T->RChild);
}
else
{
;
}
}
最后使用先序遍历递归算法求解二叉树中度为2的结点的个数.
int sum_2=0;//记录二叉树度为2的结点的个数
void NodeCount_2(BiTreeNode* &T)//统计二叉树度为2的结点
{
if(T!=NULL)
{
if(T->LChild!=NULL&&T->RChild!=NULL)//判定结点的度是否为2
{
sum_2++;
}
NodeCount_2(T->LChild);
NodeCount_2(T->RChild);
}
else
{
;
}
}
从上面三个算法的执行流程可以看出,三种二叉树遍历递归算法是实现这里三种算法的基础:只需要将二叉树的先序遍历递归算法稍加修改,即可实现这里的算法.