给定二叉树的中序遍历和前序遍历构造二叉树

给定二叉树的中序遍历和前序遍历构造二叉树

列如:
中序:1 2 3 4 5 6 7
前序:4 1 3 2 6 5 7

我们只需要注意右孩子的前序数组的下标就可以,因为中序的下标比较容易看出来

ff+mid-mf:前序首元素下标 + 当前根在中序的位置 - 中序首元素下标,等价于 前序首元素 + 当前根在中序位置与中序首元素之间的差值

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

public class L2011 {
	public static void main(String[] args) throws IOException {
		StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		sc.nextToken();
		int n = (int)sc.nval;
		int[] m = new int[n+1];
		tree[] T = new tree[n+1];
		for(int i=1; i<=n; i++) {
			sc.nextToken();
			m[i] = (int)sc.nval;
			T[i] = new tree();
		}
		int[] f = new int[n+1];
		for(int i=1; i<=n; i++) {
			sc.nextToken();
			f[i] = (int)sc.nval;
		}
		int root = meger(T,n,m,f,1,n,1,n,1);
		
		System.out.println(root);
		
	}

	//k 此时是第几层循环
	//mid 此时根在中序中的位置											中序数组的起始位置	前序
	private static int meger(tree[] t, int n, int[] m, int[] f,int mf,int ml,int ff,int fl,int k) {
		if(mf>ml || k>n) {
			return 0;
		}
		int mid = 0;
		// TODO Auto-generated method stub
		
		for(int i=mf; i<=ml; i++) {
			if(m[i]==f[ff]) {
				mid = i;  //在中序中,根的位置
				break;
			}
		}
		t[m[mid]].Lchildren = meger(t,n,m,f,mf,mid-1,ff+1,ff+mid-mf,k+1);
		t[m[mid]].Rchildren = meger(t,n,m,f,mid+1,ml,ff+mid-mf+1,fl,k+1);
		
		return m[mid];
	}

}

class tree{
	int Lchildren; 
	int Rchildren;
}

你可能感兴趣的:(pta,算法,排序算法,数据结构)