import java.util.*;
public class Solution {
private Map<Integer, Integer> map = new HashMap<>();
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型一维数组 先序遍历
* @param zhongxu int整型一维数组 中序遍历
* @return int整型一维数组
*/
public int[] solve (int[] pre, int[] in) {
// write code here
if (pre == null || in == null) {
return new int[0];
}
for (int i = 0; i < in.length; i++) {
map.put(in[i], i);
}
TreeNode root = reconstruct(pre, 0, pre.length - 1, in, 0, in.length - 1);
List<List<Integer>> list = levelOrder(root);
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
List<Integer> level = list.get(i);
res[i] = level.get(level.size() - 1);
}
return res;
}
private List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) {
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
TreeNode cur = root;
queue.offer(cur);
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> level = new ArrayList<>();
for (int i = 0; i < size; i++) {
cur = queue.poll();
level.add(cur.val);
if (cur.left != null) {
queue.offer(cur.left);
}
if (cur.right != null) {
queue.offer(cur.right);
}
}
res.add(level);
}
return res;
}
private TreeNode reconstruct(int[] pre, int pi, int pj, int[] in, int ni, int nj) {
if (pi > pj) {
return null;
}
TreeNode root = new TreeNode(pre[pi]);
int index = map.get(pre[pi]);
root.left = reconstruct(pre, pi + 1, pi + index - ni, in, ni, index - 1);
root.right = reconstruct(pre, pi + index - ni + 1, pj, in, index + 1, nj);
return root;
}
public static class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
}