DS二叉树--叶子数量

题目描述

计算一颗二叉树包含的叶子结点数量。

提示:叶子是指它的左右孩子为空。

建树方法采用“先序遍历+空树用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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值