검지 Offer 면접 문제: 두 갈래 나무 재건
5347 단어 검지 Offer 면접 문제
두 갈래 나무를 재건하다
제목은 어떤 두 갈래 나무의 앞 순서와 중간 순서를 입력한 결과를 설명합니다. 이 두 갈래 나무를 다시 만드십시오.입력한 앞 순서와 중간 순서의 결과에 중복된 숫자가 없다고 가정하십시오.예를 들어 앞 순서 반복 시퀀스 {1,2,4,7,3,5,6,8}와 중간 순서 반복 시퀀스 {4,7,2,1,5,3,8,6}를 입력하면 두 갈래 트리를 재건하고 되돌려줍니다.
분석
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if((pre.length <= 0 && in.length <= 0) || pre.length != in.length)
return null;
//
TreeNode root = new TreeNode(pre[0]);
//
int middle = 0;
for(int i=0; i < pre.length; i++){
if(in[i] == pre[0])
middle = i;
}
// :
int[] new_pre_left = new int[middle];
int[] new_pre_right = new int[in.length - middle - 1];
int[] new_in_left = new int[middle];
int[] new_in_right = new int[in.length - middle - 1];
for(int i=0; i < middle; i++){
new_pre_left[i] = pre[i+1];
new_in_left[i] = in[i];
}
for(int i=0; i < in.length - middle - 1; i++){
new_pre_right[i] = pre[i+middle+1];
new_in_right[i] = in[i+middle+1];
}
//
root.left = reConstructBinaryTree(new_pre_left, new_in_left);
root.right = reConstructBinaryTree(new_pre_right, new_in_right);
return root;
}
}
import java.util.*;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if((pre.length <= 0 && in.length <= 0) || pre.length != in.length)
return null;
//
TreeNode root = new TreeNode(pre[0]);
//
int middle = 0;
for(int i=0; i < pre.length; i++){
if(in[i] == pre[0])
middle = i;
}
root.left = reConstructBinaryTree(Arrays.copyOfRange(pre,1,middle+1),Arrays.copyOfRange(in,0,middle));
root.right = reConstructBinaryTree(Arrays.copyOfRange(pre,middle+1,in.length),Arrays.copyOfRange(in,middle+1,in.length));
return root;
}
}