검지offer-이차수 재건

1397 단어 검지offer
두 갈래 나무의 앞 순서와 중간 순서의 결과를 입력하십시오. 이 두 갈래 나무를 다시 만드십시오.입력한 앞 순서와 중간 순서의 결과에 중복된 숫자가 없다고 가정하십시오.예를 들어 앞 순서 반복 시퀀스 {1,2,4,7,3,5,6,8}와 중간 순서 반복 시퀀스 {4,7,2,1,5,3,8,6}를 입력하면 두 갈래 트리를 재건하고 되돌려줍니다.
문제 풀이 사고방식: 두 갈래 나무의 앞 순서에서 첫 번째 숫자는 항상 나무의 루트 노드이지만 중간 순서에서 루트 노드의 값은 서열의 중간에 있고 왼쪽 트리의 서열은 루트 노드의 왼쪽에 있고 오른쪽 트리의 서열은 루트 노드의 오른쪽에 있다.따라서 앞의 순서와 중간의 왼쪽 트리와 오른쪽 트리의 순서를 확인하기 위해 중간 순서에서 루트 노드의 위치를 찾아야 한다.트리 구축은 귀속 구조를 사용할 수 있습니다.tips: 중간 시퀀스에서 트리의 루트 노드의 위치를 정하고 HashMap을 사용하면 과정의 복잡도를 O(1)로 만들 수 있습니다.
 public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        // 
		Map map = new HashMap<>();
		for(int i=0;i map) {
		// TODO Auto-generated method stub
		// , 
		// 
		if(start_pre>end_pre){
			return null;
		}
		TreeNode root = new TreeNode(pre[start_pre]);

		// , HashMap 
		int rootIndex = map.get(pre[start_pre]);
		int leftLen = rootIndex - start_in;
		int pre_left = start_pre + leftLen;
		root.left = createTree(pre, start_pre+1, pre_left, in, start_in, rootIndex-1, map);
		root.right = createTree(pre, pre_left+1, end_pre, in, rootIndex+1, end_in, map);	
		return root;
	}

좋은 웹페이지 즐겨찾기