DS二叉树--左叶子数量

题目描述

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

左叶子是指它的左右孩子为空,而且它是父亲的左孩子

提示:可以用三叉链表法,也可以用现有算法对两层结点进行判断

建树方法采用“先序遍历+空树用0表示”的方法

输入

第一行输入一个整数t,表示有t个测试数据

第二行起输入二叉树先序遍历的结果,空树用字符‘0’表示,输入t行

输出

逐行输出每个二叉树的包含的左叶子数量

样例输入

3
AB0C00D00
AB00C00
ABCD0000EF000

样例输出

0
1
2
 
这里的关键判断是
#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)
        {
            if (!t->left->left && !t->left->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();
    }
}
原文地址:https://www.cnblogs.com/Liu269393/p/10217295.html