DS二叉树--叶子数量
建树头秃了一会,本来想着用先序遍历的方式建,但感觉传的东西太多了,思路有点走偏,看了看之前发的建树过程,思路终于清晰了些。本来写个先序遍历想先验证下建树过程有没有问题的,跑完发现题目要求叶子结点,就直接暴力在先序遍历的基础上改了。
题目描述
计算一颗二叉树包含的叶子结点数量。
提示:叶子是指它的左右孩子为空。
建树方法采用“先序遍历+空树用0表示”的方法,即给定一颗二叉树的先序遍历的结果为AB0C00D00,其中空节点用字符‘0’表示。则该树的逻辑结构如下图。
输入
第一行输入一个整数t,表示有t个测试数据
第二行起输入二叉树先序遍历的结果,空树用字符‘0’表示,输入t行
输出
逐行输出每个二叉树的包含的叶子数量
样例输入
3
AB0C00D00
AB00C00
ABC00D00E00
样例输出
2
2
3
Solution:
import java.util.*;
/**
* @author: Liu Canbin
* @date: 2019/1/4
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
for (int i = 0; i <n ; i++) {
String s = scanner.next();
Tree tree = new Tree();
tree.create(s);
tree.preOrderShow();//先序遍历确保建树没有问题
}
}
}
class Node
{
char data;
Node left;
Node right;
Node(char ch){
data =ch;
left = null;
right = null;
}
public void setLeft(Node left) {
this.left = left;
}
public void setRight(Node right) {
this.right = right;
}
}
class Tree{
Node root;
int pos;
String strTree;
int sum;
void create(String s){
pos = 0;
strTree = s;
sum =0;
root =createTree();
}
Node createTree(){
Node t;
char ch = strTree.charAt(pos++);
if (ch=='0'){
t = null;
}else {
t = new Node(ch);
t.setLeft(createTree());
t.setRight(createTree());
}
return t;
}
void preOrderShow(){
preOrder(root);
System.out.println(sum);
}
private void preOrder(Node t){
if (t!=null){
if (t.left==null && t.right==null) {
sum++;
}
}else {
return;
}
preOrder(t.left);
preOrder(t.right);
}
}