思路一:
首先,树的遍历从根节点开始,依次向子节点递进,重复工作,所以采用递归的方式实现节点数量的计算。
这样无法实际统计节点个数,因为size为局部变量,无法累计
int TreeSize(BTNode* root)
{
if (root==NULL)
{
return;
}
int size = 0;
++size;TreeSize(root->left);
TreeSize(root->right);return size;
}
如上图所示的代码块无法实现统计节点个数的功能,因为size为局部变量,超出函数实现范围后会销毁
思路二:
最粗暴的方式解决这个问题就是将size设置为全局函数
如果使用全局变量,多次调用时会导致数值累加,必须要在再次调用前将其置零
int size = 0;
void TreeSize(BTNode* root)
{
if (root==NULL)
{
return;
}
++size;
TreeSize(root->left);
TreeSize(root->right);}
设置全局函数size解决了局部变量无法保存的数据,却导致函数体无法连续多次调用,因为全局函数会记录size的数值,如果不置零后再调用,会显示累加结果
思路三:
所以这里采用传参的方式实现
所以采用传参的方式记录数据
void TreeSize(BTNode* root,int* size)
{
if (root==NULL)
{
return;
}
else
{
++(*size);
}
TreeSize(root->left, size);
TreeSize(root->right, size);
}
可以简化为一个三目运算符表达式
int TreeSize(BTNode* root)
{
return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}//运用递归遍历
计算叶节点的递归函数:
int TreeLeafSize(BTNode* root)
{
if (root==NULL)
{
return 0;
}
else
{
if (root->left == NULL && root->right == NULL)
{
return 1;
}
}
//如果既不为空,又不是叶节点,那么返回左子树与右子树上的叶结点个数之和
return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}