import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 求二叉树的右视图 * @param preOrder int整型一维数组 先序遍历 * @param inOrder int整型一维数组 中序遍历 * @return int整型一维数组 */ public int[] solve (int[] preOrder, int[] inOrder) { // write code here // 解题思路:1.重建二叉树。2.二叉树层序遍历 TreeNode root = buildTree( preOrder, inOrder); List<Integer> rightList = rightView( root); int[] rightArray = new int[rightList.size()]; for (int i = 0; i < rightList.size(); i++) { rightArray[i] = rightList.get(i); } return rightArray; } private List<Integer> rightView(TreeNode root) { Queue<TreeNode> queue = new LinkedList<TreeNode>(); queue.add(root); List<Integer> rightList = new ArrayList<>(); while (!queue.isEmpty()) { int l = queue.size(); int v = 0; for (int i = 0; i < l; i++) { TreeNode node = queue.poll(); v = node.val; if (node.left != null) { queue.add(node.left); } if (node.right != null) { queue.add(node.right); } } rightList.add(v); } return rightList; } private TreeNode buildTree(int[] preOrder, int[] inOrder) { if (preOrder == null || inOrder == null || preOrder.length == 0) { return null; } int rootValue = preOrder[0]; int pos = 0; TreeNode root = new TreeNode(rootValue); if (preOrder.length == 1 || inOrder.length == 1) { return root; } for (int i = 0; i < inOrder.length; i++) { if (rootValue == inOrder[i]) { pos = i; break; } } root.left = buildTree(Arrays.copyOfRange(preOrder, 1, pos + 1), Arrays.copyOfRange(inOrder, 0, pos)); root.right = buildTree(Arrays.copyOfRange(preOrder, pos + 1, preOrder.length), Arrays.copyOfRange(inOrder, pos + 1, inOrder.length)); return root; } }