描述
设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写三个递归算法分别对二叉树的结点(度为0、1、2)个数进行统计。
输入
多组数据。每组数据一行,为二叉树的前序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个“0”时,输入结束。
输出
每组数据输出一行,每行三个数分别为二叉树的度为0、1、2的结点个数。每两个数用空格分隔。
输入样例 1
abcd00e00f00ig00h00
abd00e00cf00g00
0
输出样例 1
5 0 4
4 0 3
//基于二叉链表的二叉树结点个数的统计
#include <iostream>
using namespace std;
typedef struct LNode{
char data; //存储这个结点的数据
LNode *lchild; //结点的左子结点
LNode *rchild; //结点的右子结点
LNode *parent; //结点的父结点
}LNode,*Tree;
void GetTree(Tree &tree,string::iterator &it){ //递归创建树
if(*it=='0'){ //如果读取到0 直接返回 iterator往后走
it++;
return;
}
tree->data=*it; //(此时it必没有读到0) 赋值
it++; //it往后走
if(*it!='0'){tree->lchild=new LNode;tree->lchild->lchild=tree->lchild->rchild=tree->lchild->parent=NULL;} //如果it不是0就创建左子树 否则不创建;创建的时候要令它左右子树、父结点为空 不然会出问题
GetTree(tree->lchild,it);//对左子树进行创建;如果it指向0 结果就是it++ 不创建左子树 不影响程序
if(*it!='0'){tree->rchild=new LNode;tree->rchild->lchild=tree->rchild->rchild=tree->rchild->parent=NULL;} //如果it不是0就创建右子树 否则不创建;创建的时候要令它左右子树、父结点为空 不然会出问题
GetTree(tree->rchild,it);//对右子树进行创建;如果it指向0 结果就是it++ 不创建左子树 不影响程序
}
void Statistic(Tree &tree,int a[]){ //输入树和数组 求度数为0,1,2的个数
if(!tree->lchild&&!tree->rchild){//如果左右子树都不存在 为零度结点
a[0]++;
return;
}
if(tree->lchild&&tree->rchild){ //两个结点都存在为二度结点 且对左右子树进行操作
a[2]++;
Statistic(tree->lchild,a);
Statistic(tree->rchild,a);
return;
}
a[1]++; //否则为一度结点 对存在的子树进行操作
if(tree->lchild){
Statistic(tree->lchild,a);
return;
}
Statistic(tree->rchild,a);
}
void Calculate(string str){
Tree tree=new LNode;
tree->lchild=tree->rchild=tree->parent=NULL;
std::string::iterator it=str.begin();
GetTree(tree,it); //创造树
int a[3]={0};//存储度数为i个结点的个数
Statistic(tree,a); //输入树和数组 求度数为0,1,2的个数
cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl; //输出各个度数个数
}
int main(){
string str; //一行数据
while(cin>>str&&str!="0") //输入一行数据到只有零为止
Calculate(str);
return 0;
}