题目描述
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
二叉树遍历
输出描述
可能有多组测试数据,对于每组数据,
输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。
每个输出结果占一行。
解题思路
首先我们可以先创建一个节点的信息,接着写出程序的主框架,这里有一个多组输入的问题,这里采用的是scanner 中的hasNext()方法,只要还有数据就进入循环,这也是多组输入的一个固定写法。下来我们来看看这两个方法;
build方法,因为参数是字符串,所以这里用了charAt(),方法,这里就还需要一个值来记录下标,所以创建了一个index,根据题目给出的先序遍历规则,这里先创立根节点,然后下标加一,创立左子树,最后就是右子树,这里因为题目给出的是先序遍历,所以右子树完了之后,这棵树也就遍历完成了,所以不需要加加;
InOrder方法就是普通的中序遍历,这里就不多解释,我前面的文章说过。
代码展示
import java.util.Scanner;
class TreeNode{
char val;
TreeNode left;
TreeNode right;
public TreeNode(char val){
this.val = val;
}
}
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){ //如果还有下一组元素,就进入循环,可以多组输入
index =0;
String line=scanner.next();
TreeNode root = build(line);
InOrder(root);
System.out.println();
}
}
public static void InOrder(TreeNode root){
if(root == null){
return;
}
InOrder(root.left);
System.out.print(root.val+" ");
InOrder(root.right);
}
public static int index =0;
public static TreeNode build(String input){
char ch = input.charAt(index);
if(ch == '#'){
return null;
}
TreeNode root = new TreeNode(ch);
index++;
root.left = build(input);
index++;
root.right = build(input);
return root;
}
}