题目描述: java
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。 node
输入:
输入可能包含多个测试样例,对于每一个测试案例, post
输入的第一行为一个整数n(1<=n<=1000):表明二叉树的节点个数。 测试
输入的第二行包括n个整数(其中每一个元素a的范围为(1<=a<=1000)):表明二叉树的前序遍历序列。 ui
输入的第三行包括n个整数(其中每一个元素a的范围为(1<=a<=1000)):表明二叉树的中序遍历序列。 this
输出:对应每一个测试案例,输出一行: spa
若是题目中所给的前序和中序遍历序列能构成一棵二叉树,则输出n个整数,表明二叉树的后序遍历序列,每一个元素后面都有空格。 code
若是题目中所给的前序和中序遍历序列不能构成一棵二叉树,则输出”No”。 get
样例输入:8 1 2 4 7 3 5 6 8 4 7 2 1 5 3 8 6 8 1 2 4 7 3 5 6 8 4 1 2 7 5 3 8 6样例输出:
7 4 2 5 8 6 3 1 No
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StreamTokenizer; import java.util.ArrayList; import java.util.List; public class Main { private int[] pre; private int[] mid; private List<Integer> list = new ArrayList<Integer>(); class Node { private Node left; private Node right; private int data; public Node(int data) { this.data = data; left = null; right = null; } } public int find(int data, int start, int end) { for (int i = start; i <= end; i++) { if (mid[i] == data) { return i; } } return -1; } public Node build(int pIndex, int mStart, int mEnd) { if(pIndex >= pre.length)return null; int mIndex = find(pre[pIndex], mStart, mEnd); if (mIndex == -1 || pIndex + mIndex - mStart + 1 > pre.length) { return null; } if (mStart == mEnd) { return new Node(mid[mStart]); } Node node = new Node(pre[pIndex]); node.left = build(pIndex + 1, mStart, mIndex - 1);//左节点的根为pIndex + 1 node.right = build(pIndex + mIndex - mStart + 1, mIndex + 1, mEnd);//右节点的根为pIndex + mIndex - mStart + 1 return node; } public void postOrder(Node root){ if(root.left !=null)postOrder(root.left); if(root.right != null)postOrder(root.right); list.add(root.data); } public void print(){ if(pre.length > list.size()){ System.out.println("No"); }else{ for(int i = 0; i < list.size(); i++){ System.out.print(list.get(i)+" "); } System.out.println(); } } public void run(int n) { postOrder(build(0, 0, n - 1)); print(); } public static void main(String[] args) throws IOException { StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); while(st.nextToken() != StreamTokenizer.TT_EOF){ int n = (int)st.nval; int count = 0; Main m = new Main(); m.pre = new int[n]; m.mid = new int[n]; while(count < n && st.nextToken() != st.TT_EOF)m.pre[count++] = (int)st.nval; count = 0; while(count < n && st.nextToken() != st.TT_EOF)m.mid[count++] = (int)st.nval; m.run(n); } } }