计算一颗二叉树包含的叶子结点数量。
左叶子是指它的左右孩子为空,而且它是父亲的左孩子
提示:可以用三叉链表法,也可以用现有算法对两层结点进行判断
建树方法采用“先序遍历+空树用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; }