题解 | #输出二叉树的右视图#
输出二叉树的右视图
https://www.nowcoder.com/practice/c9480213597e45f4807880c763ddd5f0
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 求二叉树的右视图 * @param preOrder int整型一维数组 先序遍历 * @param inOrder int整型一维数组 中序遍历 * @return int整型一维数组 */ Map<Integer, Integer> map; public int[] solve (int[] preOrder, int[] inOrder) { // write code here TreeNode root = buildTree(preOrder, inOrder); // 层序遍历 Queue<TreeNode> que = new LinkedList<>(); int tmp = 0; List<Integer> list = new ArrayList<>(); que.offer(root); while(!que.isEmpty()) { int size = que.size(); while(size-- > 0) { TreeNode node = que.poll(); if(node.left != null) { que.offer(node.left); } if(node.right != null) { que.offer(node.right); } tmp = node.val; } list.add(tmp); } int[] arr = new int[list.size()]; for(int i = 0; i < list.size(); i++) { arr[i] = list.get(i); } return arr; } public TreeNode buildTree(int[] preOrder, int[] inOrder) { map = new HashMap<>(); for(int i = 0; i < inOrder.length; i++) { map.put(inOrder[i], i); } return findNode(preOrder, 0, preOrder.length, inOrder, 0, inOrder.length); } public TreeNode findNode(int[] preOrder, int preBegin, int preEnd, int[] inOrder, int inBegin, int inEnd) { if(preBegin >= preEnd || inBegin >= inEnd) return null; int val = preOrder[preBegin]; int rootIdx = map.get(val); TreeNode root = new TreeNode(val); int lenOfLeft = rootIdx - inBegin; root.left = findNode(preOrder, preBegin+1, preBegin+1+lenOfLeft, inOrder, inBegin, rootIdx); root.right = findNode(preOrder, preBegin + lenOfLeft + 1, preEnd, inOrder,rootIdx + 1, inEnd); return root; } }