二叉树的构建及遍历(在线OJ)
描述
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。
例如如下的先序遍历字符串:
ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入描述:
输入包括1行字符串,长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。
示例1
输入: abc##de#g##f###
输出: c b e g d f a
分析:
对于打开形如下图的这种 IO
类型的 OJ
题目,一般的做题步骤:
- (1)需要创建一个Main类
- (2)需要提供一个main方法
- (3)需要循环接收每个测试用例
- (4)有必要时,需要导入所用的包
import java.util.Scanner;
public class Main {
//定义结点
public static class TreeNode{
char value ;
TreeNode left;
TreeNode right;
//构造方法
public TreeNode(char value){
this.value=value;
}
}
TreeNode root; //指向二叉树的根结点
int index;
public void createBinaryTree(String preStr,char invalid){
index=0;
root=createBinaryTreeN(preStr,invalid);
}
//创建二叉树
//invalid表示无效的字符
TreeNode createBinaryTreeN(String preStr,char invalid){
TreeNode treeRoot=null;
if( index<preStr.length() && preStr.charAt(index)!=invalid){
//创建根结点
treeRoot=new TreeNode(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();
}
private void InOrder(TreeNode treeRoot){
if(treeRoot!=null){
//先遍历根的左子树
InOrder(treeRoot.left);
//再遍历根结点
System.out.print(treeRoot.value+" ");
//遍历根的右子树
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();
}
}
}