思路

1.根据前序遍历的字符串,创建二叉树,再通过创建的二叉树,打印中序遍历

2.给了前序遍历,可以找到根节点的位置

3.#代表空树,空节点是指定的,因此可以创建唯一二叉树

4.前序遍历,先创建根节点,如果遇到#,返回的同时用子节点接收

5.因为要递归,所以不采用循环来遍历字符串,设置一个静态成员变量i

6.读取字符串中i位置的字符,如果不是#,根据取到的值创建根节点,i++;

7.先创建左子树,再创建右子树,根节点为空时返回,根节点的左右分别指向返回值

8.如果遇到#,i++,返回的结点为null

9.利用中序遍历打印

    public char val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(char val){
        this.val = val;
    }

}
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) { // 
           String str = in.nextLine();
           TreeNode root = creatTree(str);
           inorder(root);
        }
    }
    public static int i = 0;//i记录读取的字符
    public static TreeNode creatTree(String str){//创建二叉树
        TreeNode root = null;
       if(str.charAt(i)!='#'){
        root = new TreeNode(str.charAt(i));
        i++;//创建完根节点后,i++,先创建左树,再创建右树
        root.left = creatTree(str);
        root.right = creatTree(str);
       }else{
        i++;//如果是#,i++跳过
       }
        return root;//返回root,i是#时,返回空,i不是#时,返回结点,让root指向对应结点
    }
    public static void inorder(TreeNode root){
        if(root==null){//中序遍历打印
            return;
        }
        inorder(root.left);
        System.out.print(root.val+" ");
        inorder(root.right);
    }
}