二叉树遍历
题目描述
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入描述:
输入包括1行字符串,长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据,
输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。
每个输出结果占一行。
示例1
输入
abc##de#g##f###
输出
c b e g d f a
题解:首先构建二叉树,然后将其进行中序遍历
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class TreeNode1
{
char val;
TreeNode1 left;
TreeNode1 right;
TreeNode1()
{
}
TreeNode1(char val)
{
this.val = val;
}
TreeNode1(char val, TreeNode1 left, TreeNode1 right)
{
this.val = val;
this.left = left;
this.right = right;
}
}
//二叉树的遍历
public class Main
{
public static TreeNode1 buildTree(List<Character> in, List<Character> out)
{
if (in.isEmpty())
{
return null;
}
char rootVal = in.remove(0);
if (rootVal == '#')
{
out.addAll(in);
return null;
}
TreeNode1 root = new TreeNode1(rootVal);
List<Character> rightOut = new ArrayList<>();
TreeNode1 leftT = buildTree(in, rightOut);
TreeNode1 rightT = buildTree(rightOut, out);
root.left = leftT;
root.right = rightT;
return root;
}
// 中序遍历
static void inOrderTraversal(TreeNode1 root)
{
if (root != null)
{
//中序遍历左子树
inOrderTraversal(root.left);
//根节点
System.out.printf("%c ", root.val);
//中序遍历右子树
inOrderTraversal(root.right);
}
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
while (sc.hasNext())
{
String str = sc.next();
List<Character> root = new ArrayList<>();
for (int i = 0; i < str.length(); i++)
{
root.add(str.charAt(i));
}
TreeNode1 ret = buildTree(root, new ArrayList<>());
inOrderTraversal(ret);
System.out.println();
}
}
}