題目描述: 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); } } }