题目描述:
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
(记得输出不匹配的话也过不去)输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。每个输出结果占一行。
思路及代码:
import java.util.Scanner;
class TreeNode{
char val;
TreeNode left;
TreeNode right;
public TreeNode(char val) {
this.val = val;
}
}
public class Main{
//构建这棵树时,为了知道在后面递归过程中知道是line中哪个元素
// 需要一个标志位,用来追踪是line中那个元素
public static int index=0;
private static TreeNode build(String line) {
index = 0;//从line的0号元素开始
//通过一个辅助方法来构建
return creatTreePreOeder(line);
}
public static TreeNode creatTreePreOeder(String line) {
//通过index来获取当前执行的是哪个元素
char cur = line.charAt(index);
if (cur == '#') {
return null;//#代表当前元素没有左右子树
}
//如果当前cur的值不是#,就创建一个节点,
TreeNode node = new TreeNode(cur);
//更新index的值,下一个节点开始就是当前cur的左子树的前序遍历结果
index++;
node.left = creatTreePreOeder(line);//index的值已更新
index++;
//左子树遍历完,开始遍历右子树
node.right = creatTreePreOeder(line);
return node;
}
public static void inorderTraversal(TreeNode root){
if (root==null){
return;
}
inorderTraversal(root.left);
System.out.print(root.val+" ");
inorderTraversal(root.right);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//因为在线OJ中的一般都是多组输入的,所以要循环输入
while (scanner.hasNext()) {
//这里的line里输入的是一组形如abc##de#g##f###的先序遍历二叉树值(根左右)
String line = scanner.next();
//根据输入的line值去构建树
//Main tree=new Main();
TreeNode root = build(line);
//再对该树进行中序遍历
inorderTraversal(root);
//在线oj的输出一定要注意,要符合题目要求。若是多个空格或者少个空格则都不能通过
System.out.println();
}
}
}
还是要注意细节呀,有问题先自己解决