目录
1.题目内容
描述
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入描述:
输入包括1行字符串,长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。
示例1
输入:
abc##de#g##f###输出:
c b e g d f a
2.解题思路
二叉树搭建(图):
由题意可得,此字符串为先序遍历,将示例1画为二叉树如下图:
则中序遍历(左根右)结果为: c b e g d f a
框架思路:
1.先获取一个前序遍历的字符串
String str=in.nextLine();
2.将字符串通过前序遍历的方式还原为一棵树
TreeNode root=preOrderBuild(str);
3.再按照中序遍历的方式输出它的值
inOrder(root);
preOrderBuild()方法实现
1.由于输入的是字符串,首先我们需要一个索引index帮助我们获取字符串中的每一个字符。
static int index=0;
//取出当前字符串的字符
char c=str.charAt(index);
2.当碰到空节点时不需要构建二叉树,直接index++,每得到一个不为'#'的节点,递归的构建二叉树。(此时root为index指向的节点)。
static int index=0;
private static TreeNode preOrderBuild(String str) {
//base case
if(index>=str.length()){
return null;
}
//取出当前字符串的字符
char c=str.charAt(index);
//碰到空节点不需要构建
if(c=='#'){
index++;
return null;
}
TreeNode root=new TreeNode(c);
index++;
root.left=preOrderBuild(str);
root.right=preOrderBuild(str);
return root;
}
}
代码图解:
以示例1为例:
1.index=0,首先指向a, 不为'#',卡在步骤①,调用自身,此时,index变为2
此时的二叉树:
2.c!='#',继续卡在步骤②,此时index变为3
此时的二叉树:
3. c!='#',继续卡在步骤③,此时index变为4
此时的二叉树:
4.c=='#',index变为5,返回null,将c和null连接起来,此时的二叉树:
5..继续进行c的右子树递归,c=='#',index变为6,返回null
此时的二叉树:
6.进行第⑤步,将root返回,即将c和b连接起来
此时的二叉树:
7. 重复上述步骤即可。
inOrder()方法实现
用递归实现中序遍历,详情可见我的另一篇博客----《用Java实现二叉树的中序遍历(递归和迭代)
http://t.csdn.cn/MQpZshttp://t.csdn.cn/MQpZs
private static void inOrder(TreeNode root) {
if(root==null){
return;
}
inOrder((root.left));
System.out.print(root.val+" ");
inOrder(root.right);
}
3.代码展示
package tree;
import java.util.Scanner;
public class Main {
public static class TreeNode{
char val;
TreeNode left;
TreeNode right;
TreeNode(char val){
this.val=val;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextLine()) {
//先多组输入字符串测试数据
String str=in.nextLine();
//获取根节点,构建二叉树
TreeNode root=preOrderBuild(str);
//根据根节点进行中序遍历
inOrder(root);
//每遍历完一棵树换一行
System.out.println();
}
}
private static void inOrder(TreeNode root) {
if(root==null){
return;
}
inOrder((root.left));
System.out.print(root.val+" ");
inOrder(root.right);
}
//相当于字符串下标
static int index=0;
private static TreeNode preOrderBuild(String str) {
//base case
if(index>=str.length()){
return null;
}
//取出当前字符串的字符
char c=str.charAt(index);
//碰到空节点不需要构建
if(c=='#'){
index++;
return null;
}
TreeNode root=new TreeNode(c);
index++;
root.left=preOrderBuild(str);
root.right=preOrderBuild(str);
return root;
}
}