基础数据结构-二叉树-拓展:计算二叉树的左叶子数

计算一颗二叉树包含的叶子结点数量。
左叶子是指它的左右孩子为空,而且它是父亲的左孩子

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

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

输入

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

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

输出

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

样例输入

3
AB0C00D00
AB00C00
ABCD0000EF000

样例输出

0
1
2

 

#include<iostream> 
#include<string> 
using namespace std; 
int sum=0; 
class BiTreeNode{ 
public: 
    char data; 
    BiTreeNode *LeftChild; 
    BiTreeNode *RightChild; 
    BiTreeNode():LeftChild(NULL),RightChild(NULL){} 
    ~BiTreeNode(){} 
}; 
  
class BiTree{ 
private: 
    BiTreeNode *Root; 
    int pos; 
    string strTree; 
    BiTreeNode* CreateBiTree(); 
    void PreOrder(BiTreeNode* t); 
    void InOrder(BiTreeNode* t); 
    void PostOrder(BiTreeNode* t); 
public: 
    BiTree(){}; 
    ~BiTree(){}; 
    void CreateTree(string TreeArray); 
    void PreOrder(); 
    void InOrder(); 
    void PostOrder(); 
}; 
  
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->LeftChild=CreateBiTree(); 
        T->RightChild=CreateBiTree(); 
    } 
    return T; 
} 
  
void BiTree::PreOrder() 
{ 
    PreOrder(Root); 
} 
  
void BiTree::PreOrder(BiTreeNode* t) 
{ 
    if(t) 
    { 
        if(t->LeftChild){ 
            PreOrder(t->LeftChild); 
        } 
        else if(!t->RightChild)  sum++; 
        if(t->RightChild&&t->RightChild->LeftChild) PreOrder(t->RightChild->LeftChild); 
    } 
} 
  
void BiTree::InOrder() 
{ 
    InOrder(Root); 
} 
  
void BiTree::InOrder(BiTreeNode* t) 
{ 
    if(t) 
    { 
        InOrder(t->LeftChild); 
        cout<<t->data; 
        InOrder(t->RightChild); 
    } 
} 
  
void BiTree::PostOrder() 
{ 
    PostOrder(Root); 
} 
  
void BiTree::PostOrder(BiTreeNode*t) 
{ 
    if(t) 
    { 
        PostOrder(t->LeftChild); 
        PostOrder(t->RightChild); 
        cout<<t->data; 
    } 
} 
  
  
int main() 
{ 
    int t; 
    string str; 
    BiTree BT; 
    BiTreeNode BTN; 
    cin>>t; 
    while(t--) 
    { 
        sum=0; 
        cin>>str; 
        BT.CreateTree(str); 
        BT.PreOrder(); 
        cout<<sum<<endl; 
    } 
    return 0; 
}

 

posted @ 2017-03-02 18:06  Nathaneko  阅读(812)  评论(0编辑  收藏  举报