前言
关于IO类型的OJ题目要注意:
1.需要创建Main类
2.需要提供一个main方法
3.需要循环接收每个测试用例
4.需要用户自己导入所需要的包
一、题目描述
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。
例如如下的先序遍历字符串:
ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
二、输入输出描述
输入: 输入包括1行字符串,长度不超过100。
输出: 可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。
示例:
输入:abc##de#g##f###
输出:c b e g d f a
三、代码实现
import java.util.Scanner;
public class Main{
//二叉树的结点进行定义
public static class BTNode{
BTNode left;
BTNode right;
char val;
BTNode (char val){
this.val=val;
}
}
//二叉树的根结点
BTNode root;
//给出索引
int index;
//给下面的创建二叉树的方法包装一层
public void createBinaryTree(String preStr,char invalid){
index=0;
root=createBinaryTreeN(preStr,invalid);
}
//创建二叉树
BTNode createBinaryTreeN(String preStr,char invalid){
BTNode treeRoot=null;
if(index<preStr.length()&&preStr.charAt(index)!=invalid){
//创建根结点
treeRoot=new BTNode(preStr.charAt(index));
//创建根结点的左子树
++index;
treeRoot.left=createBinaryTreeN(preStr,invalid);
//创建根结点的右子树
++index;
treeRoot.right=createBinaryTreeN(preStr,invalid);
}
return treeRoot;
}
//对下面的中序遍历方法包装一层,使主方法时调用方便
public void inOrder(){
inOrder(root);
System.out.println();
}
//对二叉树进行中序遍历,前面写到过
public void inOrder(BTNode treeRoot){
if(treeRoot!=null){
inOrder(treeRoot.left);
System.out.print(treeRoot.val+" ");
inOrder(treeRoot.right);
}
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
//接收前序遍历的结果
String str=sc.nextLine();
Main tree=new Main();
tree.createBinaryTree(str,'#');
tree.inOrder();
}
}
}
关于invalid的解释:
#表示空格,空格字符代表空树,将invalid单独给出是为了实际应用时随着代表空树的不同字符更容易改变,直接更改主方法中传入参数的值即可