#include<bits/stdc++.h>
#define ll long long
//#define int ll
#define pii pair<int,int>
#define mem(a,b) memest(a,b,sizeof(a))
#define endl '\n'
#define N 100005
const int inf=0x3f3f3f3f;
const double pi=acos(-1.0);
using namespace std;
int c=0;
int sum[N],co=-1;
typedef struct TNodes//定义二叉树
{
char data;
TNodes *lnode,*rnode;
}*TNode;
void CreatTree(TNode &t) //创建二叉树
{
char c;
cin>>c;
if(c=='#') t=NULL;
else
{
t=new TNodes;
t->data=c;
CreatTree(t->lnode);
CreatTree(t->rnode);
}
}
int Depth(TNode t)// 求二叉树深度
{
if(!t) return 0;
int m=Depth(t->lnode);
int n=Depth(t->rnode);
if(m>n) return m+1;
else return n+1;
}
int jds(TNode t)//求树叶节点数
{
if(!t) return 0;
if(!t->lnode&&!t->rnode) return 1;
return jds(t->lnode)+jds(t->rnode);
}
void Width(TNode t,int k)//求宽度
{
co=max(co,k);
if(!t) return;
if(!t->lnode&&!t->rnode) sum[k]++;
Width(t->lnode,k+1);
Width(t->rnode,k+1);
}
int Tree2(TNode t)// 树叶结点为2的个数(c为全局变量)
{
if(!t) return 0;
if(t->lnode&&t->rnode) c++;
Tree2(t->lnode);
Tree2(t->rnode);
return c;
}
int Tree1(TNode t)// 树叶结点为1的个数
{
if(!t) return 0;
if(t->lnode&&!t->rnode) c++;
else if(!t->lnode&&t->rnode) c++;
Tree1(t->lnode);
Tree1(t->rnode);
return c;
}
int get(TNode t)//空链域个数
{
if(!t) return 0;
if(!t->lnode) c++;
else(get(t->lnode));
if(!t->rnode) c++;
else(get(t->rnode));
return c;
}
void houxu(TNode t)//先序转后序
{
if(t)
{
houxu(t->lnode);
houxu(t->rnode);
cout<<t->data; //转什么序把这句放到哪
}
}
signed main()
{
TNode t;//定义
CreatTree(t);
cout<<Depth(t);
cout<<jds(t);
Width(t,1);
int Max=-1;
for(int i=1;i<=co;i++)
{
Max=max(Max,sum[i]);
}
cout<<Max;
cout<<Tree1(t);
cout<<Tree2(t);
cout<<get(t);
houxu(t);
return 0;
}