思路
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);
}
}