#include<bits/stdc++.h>
using namespace std;
typedef struct node{
char data;
struct node *lchild,*rchild;
}*BiTree;
int len=0;
string s;
//字符串方式输入先序建立二叉树
void CreateTree(BiTree &T)
{
if(len==s.size()) return;
char c=s[len++];
if(c=='#') T=NULL;//#表示节点为空
else
{
T=new node;
T->data=c;
T->lchild=T->rchild=NULL;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}
//字符输入方式先序遍历建立二叉树
createTree(BiTree &T)
{
char c;
cin>>c;
if(c=='0') T=NULL;//0表示节点为空
else
{
T=new node;
T->data=c;
T->lchild=T->rchild=NULL;
createTree(T->lchild);
createTree(T->rchild);
}
}
void Preorder(BiTree T)
{
if(T!=NULL)
{
cout<<T->data<<" ";
Preorder(T->lchild);
Preorder(T->rchild);
}
}
void Inorder(BiTree T)
{
if(T!=NULL)
{
Inorder(T->lchild);
cout<<T->data<<" ";
Inorder(T->rchild);
}
}
void Postorder(BiTree T)
{
if(T!=NULL)
{
Postorder(T->lchild);
Postorder(T->rchild);
cout<<T->data<<" ";
}
}
//二叉树叶节点
int leaf_number(BiTree T)
{
if(T==NULL) return 0;
if(T->lchild==NULL&&T->rchild==NULL) return 1;
return leaf_number(T->lchild)+leaf_number(T->rchild);
}
//二叉树深度
int depth(BiTree T)
{
if(T==NULL) return 0;
int x=depth(T->lchild);
int y=depth(T->rchild);
return max(x,y)+1;
}
int main()
{
BiTree T;
len=0;
createTree(T);
Preorder(T);
cout<<endl;
Inorder(T);
cout<<endl;
Postorder(T);
cout<<endl;
int leaf=leaf_number(T);
cout<<leaf<<endl;
return 0;
}