题目
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入描述:
输入包括1行字符串,长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。
示例1
输入: abc##de#g##f###
输出: c b e g d f a
代码
import java.util.Scanner;
class TreeNode{
char val;
TreeNode left;
TreeNode right;
public TreeNode(char val){
this.val = val;
}
}
public class Main{
//使用递归
//为了在递归过程中也能明确知道当前正在处理的是哪个下标,需要使用一个成员变量index,记录
//当前节点对于的下标
public static int index = 0;
public static TreeNode build(String line){
//由于用例有多组,需要保证每个用例开始递归之前,都把index设为0,保证多个用例之间不干扰
index = 0;
return _build(line);
}
//实际通过这个进行递归,不能直接在build中递归,因为build里面有一个index = 0的语句,
//如果递归中执行了,就把index的值搞混了
public static TreeNode _build(String line){
//根据下标,把当前要处理的节点获取到
char ch = line.charAt(index);
if(ch == '#'){
return null;
}
TreeNode root = new TreeNode(ch);
index ++;
root.left = _build(line);
index++;
root.right = _build(line);
return root;
}
public static void inOrder(TreeNode root){
if(root == null){
return;
}
inOrder(root.left);
System.out.print(root.val + " ");
inOrder(root.right);
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
//系统给的测试用例往往有多组,所以要循环判断
while(scanner.hasNext()){
String line = scanner.next();
TreeNode root = build(line);
inOrder(root);//中序遍历
System.out.println();//每个输出结果占一行
}
}
}