题解 | #输出二叉树的右视图#
输出二叉树的右视图
http://www.nowcoder.com/practice/c9480213597e45f4807880c763ddd5f0
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型一维数组 先序遍历
* @param zhongxu int整型一维数组 中序遍历
* @return int整型一维数组
*/
class TreeNode{
private int val;
private TreeNode left;
private TreeNode right;
public TreeNode(int val){
this.val = val;
left = null;
right = null;
}
}
List<Integer> list = new ArrayList<>();
public int[] solve (int[] xianxu, int[] zhongxu) {
// write code here
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
int size = queue.size();
for(int i = 0;i<size;i++){
TreeNode cur = queue.poll();
if(i==size-1){
list.add(cur.val);
}
if(cur.left != null){
queue.add(cur.left);
}
if(cur.right!=null){
queue.add(cur.right);
}
}
for(int i = 0;i<ans.length;i++){
ans[i] = list.get(i);
}
return ans;
public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
if(pre == null||pre.length == 0){
return null;
}
for(int i = 0;i<vin.length;i++){
map.put(vin[i],i);
}
return binaryTree(pre,0,pre.length-1,vin,0,vin.length-1);
}
public TreeNode binaryTree(int[] pre,int preLeft,int preRight,int[] vin,int vinLeft,int vinRight){
if(preLeft > preRight){
return null;
}
TreeNode root = new TreeNode(pre[preLeft]);
int index = map.get(pre[preLeft]);
int size = index-vinLeft;
root.left = binaryTree(pre,preLeft+1,preLeft+size,vin,vinLeft,index-1);
root.right = binaryTree(pre,preLeft+size+1,preRight,vin,index+1,vinRight);
return root;
}
}
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型一维数组 先序遍历
* @param zhongxu int整型一维数组 中序遍历
* @return int整型一维数组
*/
class TreeNode{
private int val;
private TreeNode left;
private TreeNode right;
public TreeNode(int val){
this.val = val;
left = null;
right = null;
}
}
List<Integer> list = new ArrayList<>();
public int[] solve (int[] xianxu, int[] zhongxu) {
// write code here
TreeNode root = reConstructBinaryTree(xianxu,zhongxu);
//按层遍历将每层最后一个加入到集合中
if(root == null) return new int[]{};Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
int size = queue.size();
for(int i = 0;i<size;i++){
TreeNode cur = queue.poll();
if(i==size-1){
list.add(cur.val);
}
if(cur.left != null){
queue.add(cur.left);
}
if(cur.right!=null){
queue.add(cur.right);
}
}
}
//将集合转化为数组
int [] ans = new int[list.size()];for(int i = 0;i<ans.length;i++){
ans[i] = list.get(i);
}
return ans;
}
//利用前序和中序遍历生成二叉树
Map<Integer,Integer> map = new HashMap<>();public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
if(pre == null||pre.length == 0){
return null;
}
for(int i = 0;i<vin.length;i++){
map.put(vin[i],i);
}
return binaryTree(pre,0,pre.length-1,vin,0,vin.length-1);
}
public TreeNode binaryTree(int[] pre,int preLeft,int preRight,int[] vin,int vinLeft,int vinRight){
if(preLeft > preRight){
return null;
}
TreeNode root = new TreeNode(pre[preLeft]);
int index = map.get(pre[preLeft]);
int size = index-vinLeft;
root.left = binaryTree(pre,preLeft+1,preLeft+size,vin,vinLeft,index-1);
root.right = binaryTree(pre,preLeft+size+1,preRight,vin,index+1,vinRight);
return root;
}
}