public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型一维数组 先序遍历
* @param zhongxu int整型一维数组 中序遍历
* @return int整型一维数组
*/
public int[] solve (int[] xianxu, int[] zhongxu) {
// write code here
TreeNode root=reCons(xianxu,zhongxu);
return view(root);
}
//构造二叉树
public TreeNode reCons(int[] xianxu,int[] zhongxu){
if(xianxu==null||xianxu.length==0) return null;
int i;
TreeNode root=new TreeNode(xianxu[0]);
for(i=0;i<zhongxu.length;i++){
if(zhongxu[i]==xianxu[0]){
root.left=reCons(Arrays.copyOfRange(xianxu,1,1+i),Arrays.copyOfRange(zhongxu,0,i));
root.right=reCons(Arrays.copyOfRange(xianxu,1+i,xianxu.length),Arrays.copyOfRange(zhongxu,i+1,zhongxu.length));
break;
}
}
return root;
}
//层序遍历,每层的最后一个结点的值存入list
public int[] view(TreeNode root){
if(root==null) return null;
List<Integer> list=new ArrayList<>();
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
//记录当前层的结点数
int size=queue.size();
TreeNode tempNode=null;
while(size-->0){
tempNode=queue.poll();
if(tempNode.left!=null) queue.offer(tempNode.left);
if(tempNode.right!=null) queue.offer(tempNode.right);
}
list.add(tempNode.val);
}
int[] res=new int[list.size()];
for(int i=0;i<res.length;i++){
res[i]=list.get(i);
}
return res;
}
}