根据带虚结点的先序序列建立二叉树,再统计输出二叉树中具有度为1的结点数目。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据在一行中输入一个字符串(不含空格且长度不超过80),表示二叉树的先序遍历序列,其中字符*
表示虚结点(对应的子树为空)。
输出格式:
对于每组测试,对所建立的二叉树,输出该二叉树中具有度为1的结点数目。输出格式为:“num: d”,其中d为二叉树中具有度为1的结点数目。
输入样例:
HDA**C*B**GF*E***
A*B*C*D*E*F**
输出样例:
num: 3
num: 5
代码
#include<bits/stdc++.h>
using namespace std;
#define OK 1
typedef char TElemType;
typedef int Status;
int i=0;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
Status CreatBiTree(BiTree &T,string s)//字符串作为形参初始化二叉树
{
//cout<<"到了"<<s[i]<<endl;
if(!s[i])//字符串里面没有东西了结束
return OK;
if(s[i]=='*')//在递归过程中出现星号说明是空
{
i++;
T=NULL;//直接赋值为空
return OK;
}
else
{
T=(BiTree)malloc(sizeof(BiTNode));//开辟空间
T->data=s[i];//给结点赋值
i++;
CreatBiTree(T->lchild,s);//递归初始化
CreatBiTree(T->rchild,s);//递归初始化
return OK;
}
}
Status DestroyBiTree(BiTree &T)
{
if(!T)
return OK;
DestroyBiTree(T->lchild);
DestroyBiTree(T->rchild);
free(T);
}
int GetNumber(BiTree T)//求度数为1的结点
{
if(!T)//空的时候就返回0
return 0;
//cout<<"调用了"<<endl;//下面分成两种情况
//当只有左子树或者只有右子树的时候返回1
//其他情况返回左子树加右子树
if((!T->lchild&&T->rchild)||(T->lchild&&!T->rchild))
return 1+GetNumber(T->lchild)+GetNumber(T->rchild);
else
return GetNumber(T->lchild)+GetNumber(T->rchild);
}
int main()
{
string s;
BiTree B;
while(cin>>s)
{
i=0;
if(CreatBiTree(B,s)==OK)
{
int n=GetNumber(B);
cout<<"num: "<<n<<endl;
DestroyBiTree(B);
}
}
}