根据二叉树后序和中序遍历序列得出层次遍历序列

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);
}

猜你喜欢

转载自blog.csdn.net/qq_43780761/article/details/126863104