题目描述
计算一颗二叉树包含的叶子结点数量。
提示:叶子是指它的左右孩子为空。
建树方法采用“先序遍历+空树用0表示”的方法,即给定一颗二叉树的先序遍历的结果为AB0C00D00,其中空节点用字符‘0’表示。则该树的逻辑结构如下图。
输入
第一行输入一个整数t,表示有t个测试数据
第二行起输入二叉树先序遍历的结果,空树用字符‘0’表示,输入t行
输出
逐行输出每个二叉树的包含的叶子数量
样例输入
3
AB0C00D00
AB00C00
ABC00D00E00
样例输出
2
2
3
这里只要修改一下任意一个遍历函数即可,将输出改为判断当前节点是否为叶子节点
#include<iostream> #include<string> using namespace std; class BitreeNode { public: char data; BitreeNode *left; BitreeNode *right; BitreeNode():left(NULL),right(NULL){} ~BitreeNode(){} }; class Bitree { private: BitreeNode *Root; int pos,count; string strtree; BitreeNode *CreateBitree(); void countleaves(BitreeNode *t); public: Bitree() { count = 0; }; ~Bitree() {}; void CreateTree(string TreeArray); void countleaves(); }; void Bitree::CreateTree(string treearray) { pos = 0; strtree.assign(treearray); Root = CreateBitree(); } BitreeNode *Bitree::CreateBitree() { BitreeNode *T; char ch; ch = strtree[pos++]; if (ch == '0') T = NULL; else { T = new BitreeNode(); T->data = ch; T->left = CreateBitree(); T->right = CreateBitree(); } return T; } void Bitree::countleaves() { countleaves(Root); cout << count << endl; } void Bitree::countleaves(BitreeNode *t) { if (t) { if (!t->left && !t->right) count++; countleaves(t->left); countleaves(t->right); } } int main() { int t; cin >> t; while (t--) { string str; cin >> str; Bitree *tree; tree = new Bitree(); tree->CreateTree(str); tree->countleaves(); } }