题目描述
计算一颗二叉树包含的叶子结点数量。
提示:叶子是指它的左右孩子为空。
建树方法采用“先序遍历+空树用0表示”的方法,即给定一颗二叉树的先序遍历的结果为AB0C00D00,其中空节点用字符‘0’表示。则该树的逻辑结构如下图。
输入
第一行输入一个整数t,表示有t个测试数据
第二行起输入二叉树先序遍历的结果,空树用字符‘0’表示,输入t行
输出
逐行输出每个二叉树的包含的叶子数量
输入样例1
3
AB0C00D00
AB00C00
ABC00D00E00
输出样例1
2\n
2\n
3\n
#include<iostream>
using namespace std;
class BiNode {
public:
char data;
BiNode* lchild, *rchild;
BiNode* parent;
BiNode():lchild(NULL),rchild(NULL),parent(NULL){}
BiNode(char c) :data(c), lchild(NULL), rchild(NULL),parent(NULL){}
friend class BiTree;
};
class BiTree {
public:
BiNode* root;
int sum = 0;
void CreatTree() {
CreatTree(root,NULL);
}
void CreatTree(BiNode*& t,BiNode*p) {
char c;
cin >> c;
if (c != '0') {
t = new BiNode(c);//新建结点
t->parent = p;//确定双亲
CreatTree(t->lchild, t);//走左边,走不动了再走右边
CreatTree(t->rchild, t);
}
}
BiTree() :root(NULL){}
void PreOrder(BiNode* t) {
if (t) {
if (!t->lchild && !t->rchild) {
sum++;
}
PreOrder(t->lchild);
PreOrder(t->rchild);
}
}
void PreOrder() {
PreOrder(root);
cout << sum << endl;
}
};
int main() {
int t;
cin >> t;
while (t--) {
BiTree mytree;
mytree.CreatTree();
mytree.PreOrder();
}
return 0;
}