import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 求二叉树的右视图
* @param preOrder int整型一维数组 先序遍历
* @param inOrder int整型一维数组 中序遍历
* @return int整型一维数组
*/
public int[] solve (int[] preOrder, int[] inOrder) {
// write code here
List<Integer> preList = new ArrayList<>();
List<Integer> inList = new ArrayList<>();
int loopPre = preOrder.length;
for (int i = 0; i < loopPre; i++) {
preList.add(preOrder[i]);
}
int loopIn = inOrder.length;
for (int i = 0; i < loopIn; i++) {
inList.add(inOrder[i]);
}
targetMap.put(0, preList.get(0));
NodeList target = buildTree(preList, inList, null, 1);//重组二叉树
int[] targetArr = new int[targetMap.size()];
int i = 0;
for (Map.Entry<Integer, Integer> entry : targetMap.entrySet()) {
targetArr[i] = entry.getValue();
i++;
}
return targetArr;
}
private Map<Integer, Integer> targetMap = new TreeMap<>(); //按照层级默认升序排序
public NodeList buildTree(List<Integer> preList, List<Integer> inList,
NodeList target, int level) {
if (preList == null || preList.size() == 0) return null;
int rootVal = preList.get(0);
target = new NodeList(rootVal);
int rootIndex = inList.indexOf(rootVal);
List<Integer> inListLeft = null;
List<Integer> inListRight = null;
List<Integer> preListLeft = null;
List<Integer> preListRight = null;
if (rootIndex > 0) {
inListLeft = inList.subList(0, rootIndex);
preListLeft = preList.subList(1, inListLeft.size()+1);
}
if (rootIndex < inList.size() - 1) {
inListRight = inList.subList(rootIndex + 1, inList.size());
preListRight = preList.subList(preList.size() - inListRight.size(), preList.size());
}
NodeList left = buildTree(preListLeft, inListLeft, target.left, level + 1);
if (left != null) {
target.left = left;
targetMap.put(level, left.val);//当前层级无右节点时,该左节点就是最右侧节点
}
NodeList right = buildTree(preListRight, inListRight, target.right, level + 1);
if (right != null) {
target.right = right;
targetMap.put(level, right.val);//有右节点时打印右节点,使用map的特性,key相同,覆盖值
}
return target;
}
class NodeList {
int val;
NodeList left;
NodeList right;
public NodeList(int val) {
this.val = val;
}
}
}