【九度OJ1385】|【劍指offer6】重建二叉樹

題目描述: 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);
		}
	}
}
相關文章
相關標籤/搜索