DS二叉树--叶子数量

题目描述

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

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

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

猜你喜欢

转载自www.cnblogs.com/Liu269393/p/10217241.html