树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其它一种遍历的序列就可以确定一棵二叉树的结构。
假定一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树的先序遍历字符串。

输入格式

两行,每行是由大写字母组成的字符串(一行的每个字符都是唯一的),分别表示二叉树的中序遍历和按层遍历的序列。

输出格式

一行,表示二叉树的先序序列。

数据范围

输入字符串的长度均不超过26。

输入样例:

DBEAC ABCDE

输出样例:

ABDEC


  1. import java.io.*;
  2. import java.util.*;
  3. public class Main {
  4. static class TreeNode {
  5. char val;
  6. TreeNode left, right;
  7. public TreeNode(char val) {
  8. this.val = val;
  9. }
  10. }
  11. static BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
  12. public static void main(String[] args) throws IOException {
  13. String inorder, lorder;
  14. inorder = cin.readLine();
  15. lorder = cin.readLine();
  16. int n = inorder.length();
  17. // 存中序字母及它的下标
  18. Map<Character, Integer> map = new HashMap<>();
  19. TreeNode[] q = new TreeNode[30];
  20. boolean[] st = new boolean[n + 1];
  21. for (int i = 0; i < n; ++i) map.put(inorder.charAt(i), i);
  22. q[0] = new TreeNode(lorder.charAt(0));
  23. // 按层遍历 i是当前层起点,j是下一层起点
  24. for (int i = 0, j = 1; i < n; ) {
  25. for (int end = j; i < end; ++i) { //遍历当前层
  26. int pos = map.get(lorder.charAt(i)); //当前节点的中序位置
  27. st[pos] = true;
  28. // 判断左儿子是否存在
  29. if (pos > 0 && !st[pos - 1]) {
  30. q[i].left = new TreeNode(lorder.charAt(j));
  31. q[j ++] = q[i].left;
  32. }
  33. // 判断右儿子是否存在
  34. if (pos + 1 < n && !st[pos + 1]) {
  35. q[i].right = new TreeNode(lorder.charAt(j));
  36. q[j ++] = q[i].right;
  37. }
  38. }
  39. }
  40. dfs(q[0]);
  41. }
  42. static void dfs(TreeNode root) {
  43. if (root == null) return;
  44. System.out.print(root.val);
  45. dfs(root.left);
  46. dfs(root.right);
  47. }
  48. }