求每个二叉树的包含的左叶子数量
#include <iostream>
using namespace std;
int count = 0;
class BiTreeNode
{
private:
BiTreeNode *leftChild; //左子树指针
BiTreeNode *rightChild; //右子树指针
public:
char data; //数据域
//构造函数和析构函数
BiTreeNode():leftChild(NULL), rightChild(NULL){}
BiTreeNode(char item, BiTreeNode *left = NULL,
BiTreeNode *right = NULL):
data(item), leftChild(left), rightChild(right){}
~BiTreeNode(){}
BiTreeNode * &Left(void) //注意返回值类型为指针的引用类型
{return leftChild;}
BiTreeNode * &Right(void) //注意返回值类型为指针的引用类型
{return rightChild;}
};
class BiTree
{
private:
BiTreeNode *root; //根结点指针
int i;
void Destroy(BiTreeNode * &t);
void PreOrder(BiTreeNode * &t);
void InOrder(BiTreeNode * &t);
void PostOrder(BiTreeNode * &t);
void CreateBiTree(BiTreeNode * &T,const char strTree[]);
public:
//构造函数和析构函数
BiTree(void):root(NULL),i(0){}; //构造函数
~BiTree(void){}; //析构函数
//构造二叉树
void MakeTree(const char item, BiTree &left, BiTree &right); //构造二叉树
void MakeTree(const char strTree[]); //构造二叉树,利用先序遍历结果建树
void Destroy(void); //销毁二叉树
void PreOrder(); //前序遍历
void InOrder(); //中序遍历
void PostOrder(); //后序遍历
};
//2、定义销毁函数
void BiTree ::Destroy(void) //销毁二叉树,公有函数
{
Destroy(root);
}
void BiTree ::Destroy(BiTreeNode * &t)
//销毁二叉树,私有函数供共有函数调用
{
if(t != NULL && t->Left() != NULL)
Destroy(t->Left());
if(t != NULL && t->Right() != NULL)
Destroy(t->Right());
if(t != NULL)
{
// cout << t->data << " "; //此语句只是为了方便测试
delete t;
}
}
//3、定义建树函数
void BiTree::MakeTree(const char item, BiTree &left, BiTree &right)
//构造数据域为item,左子树为left,右子树为right的二叉树
{
root = new BiTreeNode(item, left.root, right.root);
}
void BiTree::MakeTree(const char strTree[])
//构造二叉树,利用先序遍历结果建树,公有函数
{
i=0;
CreateBiTree(root,strTree);
}
void BiTree::CreateBiTree(BiTreeNode * &T, const char strTree[]) //递归建树私有函数
{
char ch;
ch=strTree[i++];
if (ch=='0') T = NULL;
else
{
T=new BiTreeNode();
T->data = ch; // 生成根结点
CreateBiTree(T->Left(), strTree); // 构造左子树
CreateBiTree(T->Right(), strTree); // 构造右子树
}
}
//4、定义先序遍历函数
void BiTree::PreOrder()
//前序遍历访问二叉树,公有函数
{
PreOrder(root);
}
void BiTree::PreOrder(BiTreeNode* &t)
//前序遍历访问二叉树,私有函数t
{
if(t!=NULL)//若二叉树结点不为空,执行如下操作:
{
if(t->Left() == NULL && t->Right() == NULL) //这里的代码计算的是左右叶子的数量,怎样写只计算左叶子数量的代码啊???
count++;
PreOrder(t->Left());//2、先序遍历该结点的左孩子
PreOrder(t->Right());//3、先序遍历该结点的右孩子
}
}
int main(void)
{
int m,i;
char strTree[80];
BiTree myTree;
cin>>m; //输入一个整数t,表示有t个测试数据
cin.get();
for(i=0;i<m;i++)
{
cin>>strTree;//输入二叉树先序遍历的结果,空树用字符‘0’表示,无需考虑空树
以此类推
myTree.MakeTree(strTree);
myTree.PreOrder();
cout<<count<<endl;
count = 0;
}
return 0;
}
Sample Input
3
AB0C00D00
AB00C00
ABCD0000EF000
Sample Output
0
1
2
[解决办法]
要是子叶,后面必须是两个连着的0,要是左子叶,前面必须不是0.
for(int i = 0; i < str.size(); i++){ if('0' == str[i]) continue; if('0'== str[i+1]&&'0'== str[i+2]&& '0'!= str[i-1]) count++;}cout<<count;