题目:请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
思路:先根据前序遍历和中序遍历,得到二叉树。根据先序顺序得到根,再根据根得到其在中序遍历中的位置,然后得到左右子树的size,从而得到左右子树的先序遍历和中序遍历。最后利用栈按照层序遍历,每层最后一个输出的加入到ArrayList,因为ArrayList是动态数组,方便增删,最后再转换成数组的形式输出。
import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可* 求二叉树的右视图* @param xianxu int整型一维数组 先序遍历* @param zhongxu int整型一维数组 中序遍历* @return int整型一维数组*/private Map<Integer,Integer> map = new HashMap();public int[] solve (int[] xianxu, int[] zhongxu) {// write code hereif(xianxu.length == 0 || zhongxu.length == 0) return new int[0];for(int i=0;i<zhongxu.length;i++){map.put(zhongxu[i],i);}TreeNode node = createBinaryTree(xianxu,0,xianxu.length,zhongxu,0,zhongxu.length);Queue<TreeNode> queue = new LinkedList();ArrayList<Integer> list = new ArrayList();queue.add(node);while(!queue.isEmpty()){int size = queue.size();for(int i=0;i<size;i++){node = queue.remove();if(node.left != null){queue.add(node.left);}if(node.right != null){queue.add(node.right);}}list.add(node.val);}int[] res = new int[list.size()];for(int i=0;i<list.size();i++){res[i] = list.get(i);}return res;}public TreeNode createBinaryTree(int[] xianxu,int preBegin,int preEnd,int[] vin,int vinBegin,int vinEnd){if(preBegin>=preEnd || vinBegin>=vinEnd) return null;TreeNode node = new TreeNode(xianxu[preBegin]);int vinIndex = map.get(xianxu[preBegin]);int size = vinIndex - vinBegin;node.left = createBinaryTree(xianxu,preBegin+1,preBegin+1+size,vin,vinBegin,vinIndex);node.right = createBinaryTree(xianxu,preBegin+1+size,preEnd,vin,vinIndex+1,vinEnd);return node;}
}