1)由于二叉树本就是递归结构,所以可以用递归的思想:二叉树叶子个数等于左子树叶子个数+右子树叶子个数,当遇到孩子节点是空指针的时候就返回1,否则返回该子树的叶节点数。具体实现的话,可以将递归的二叉树后续遍历算法的开头添加一句话,即可。
2)后续变量二叉树的非递归算法,只需要记录一个count变量即可,即每次遇到叶子节点,就将count累加。
主要思想就是,后续变量二叉树。
#include
#include
typedef struct CSNode { //孩子-兄弟节点的定义
char data;
struct CSNode *firstChild;
struct CSNode *nextSibling;
} CSNode, *CSTree;
int leafNum = 0;//全局变量,存储叶子节点的数量
void createCSTree(CSTree &tree)
{ //创建孩子-兄弟二叉树
char c = getchar();
if(c == '*') tree = NULL;
else {
tree = (CSTree)malloc(sizeof(CSNode)); tree->data = c;
createCSTree(tree->firstChild);
createCSTree(tree->nextSibling);
}
}
//计算叶子节点的数目,孩子-兄弟二叉树中的叶子节点是指那些没有firstChild的节点
void getLeafNum(CSTree tree)
{
if(tree) {
if(!tree->firstChild) leafNum ++;
getLeafNum(tree->firstChild);
getLeafNum(tree->nextSibling);
}
}
int main()
{
CSTree csTree;
printf("输入孩子兄弟链表表示的树的结点:"); createCSTree(csTree);
getLeafNum(csTree);
printf("叶子节点的数量为:%d\n",leafNum);
return 0;
}
例如输入:
abc***de**f*g***
输出为:叶子节点的数量为:4