1.题目
有一棵二叉树,每个节点由一个大写字母标识。现有两组字母,分别表示后序遍历和中序遍历的结果,请你输出层次遍历的结果。
输入描述:输入第一行序列,表示后序遍历(左孩子->右孩子->根节点);
输入第二行序列,表示中序遍历(左孩子->根节点->右孩子)。
输出描述
输出层次遍历的结果。
示例:
输入
CBEFDA
CBAEDF
输出
ABDCEF
2.分析
1)后序遍历的最后一个一定是根结点
2)在中序遍历中确认1)中得到的根节点的位置,该节点左边为以它为根结点的新二叉树的左子树,该节点右边为以它为根结点的新二叉树的右子树。
3)后续遍历得到根结点的左边全部是它的左右子树节点
3.Java语言解决:
public static void od007(){ Scanner scanner=new Scanner(System.in); List<String> hou=Arrays.stream(scanner.nextLine().split("")).collect(Collectors.toList()); List<String> zhong=Arrays.stream(scanner.nextLine().split("")).collect(Collectors.toList()); scanner.close(); String gen=hou.get(hou.size()-1); LinkedList<String> queue=new LinkedList<>(); queue.add(gen); String result=""; while (queue.size()!=0){ String start=queue.getFirst(); int startIndex=zhong.indexOf(start); List<String> zhongLeft=new ArrayList<>(); for (int i=0;i<startIndex;i++){ zhongLeft.add(i,zhong.get(i)); } List<String> zhongRight=new ArrayList<>(); for (int i=startIndex+1;i<zhong.size();i++){ zhongRight.add(zhong.get(i)); } int startIndex2=hou.indexOf(start); List<String> houLeft=new ArrayList<>(); for (int i=0;i<startIndex2;i++){ if (zhongLeft.contains(hou.get(i))){ houLeft.add(i,hou.get(i)); } } List<String> houRight=new ArrayList<>(); for (int i=0;i<startIndex2;i++){ if (zhongRight.contains(hou.get(i))) houRight.add(hou.get(i)); } if (houLeft.size()!=0&&!result.contains(houLeft.get(houLeft.size()-1))){ queue.add(houLeft.get(houLeft.size()-1)); } if (houRight.size()!=0&&!result.contains(houLeft.get(houLeft.size()-1))){ queue.add(houRight.get(houRight.size()-1)); }; result=result+start; queue.removeFirst(); } System.out.println(result); }