首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求每个二叉树的包孕的左叶子数量

2012-10-13 
求每个二叉树的包含的左叶子数量#include iostreamusing namespace stdint count 0class BiTreeNode

求每个二叉树的包含的左叶子数量
#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.

C/C++ code
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; 

热点排行