#include <stdio.h>
#include <stdlib.h>

 typedef struct TreeNode
 {
    char val;
    struct TreeNode* left;//在结构体内部引用自身类型时,必须使用完整的结构体标签,所 以会有struct
    struct TreeNode* right;
 }TreeNode;

TreeNode* MakeTree(char* arr,int* count)//TreeNode*目的是为了定义函数的返回值类型必须为结指向构体TreeNode的指针
{
    if(arr[(*count)]=='#'||arr[(*count)]=='\0')
    {
        return NULL;
    }
    TreeNode* newnode=(TreeNode*)malloc(sizeof(TreeNode));//动态分配大小为结构体TreeNode成员所需大小的新的内存空间,并将空间的类型强制转为TreeNode*,并将空间命名为newnode(新节点)
    newnode ->val=arr[(*count)++];//新节点的val=arr[*count],并让count++
    newnode ->left=MakeTree(arr,count);//新节点的左孩子开始递归(递归到返回Null的时候递归结束)
    (*count)++;//跳过值为Null的指针
    newnode ->right=MakeTree(arr,count);//新节点的右孩子开始递归(递归到Null结束)
    return newnode;//回到上一层递归的根节点
}

void zhongxu(TreeNode* root)//中序输出函数
{
    if(root==NULL)//如果节点为空返回空
    {
        return;
    }
    zhongxu(root ->left);//递归遍历左孩子
    printf("%c ", root->val);//左孩子遇到空值则返回上一个节点(上一层递归)的root的值
    zhongxu(root ->right);//递归遍历右孩子
}

int main() {
    char arr[101];
    int count=0;
    while (scanf("%s", &arr) != EOF) 
    { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to 
        TreeNode* Tree=MakeTree(arr, &count);
        zhongxu(Tree);
        
    }
    return 0;
}