题解 | #输出二叉树的右视图#TOP41

思路:
1.根据TOP40, 我们知道由前序遍历、中序遍历,怎么构建出一棵树
2.根据TOP26,我们知道怎么实现树的层序遍历
3.层序遍历,每层最后一个节点组成的视图就是右视图

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 求二叉树的右视图
     * @param xianxu int整型一维数组 先序遍历
     * @param zhongxu int整型一维数组 中序遍历
     * @return int整型一维数组
     */
    public int[] solve (int[] xianxu, int[] zhongxu) {
        // write code here
        if(xianxu == null || xianxu.length == 0 || zhongxu == null || zhongxu.length == 0){
            return new int[]{};
        }
        
        TreeNode root = make(xianxu, 0 ,xianxu.length -1 , zhongxu, 0, zhongxu.length -1);
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        TreeNode temp = null;
        List<Integer> result = new ArrayList<Integer>();
        while(!queue.isEmpty()){
            int size = queue.size();
            while(size > 0){
                size --;
                temp = queue.poll();
                if(temp.left != null){
                    queue.add(temp.left);
                }
                if(temp.right != null){
                    queue.add(temp.right);
                }
                
            }
            result.add(temp.val);
        }
        return result.stream().mapToInt(Integer::valueOf).toArray();
        
        
    }
    private TreeNode make(int[] pre, int preStart, int preEnd, int[] middle, int middleStart,int middleEnd){
        TreeNode node = new TreeNode(0);
        node.val = pre[preStart];
        int endIndex = preStart;
        //找到中序遍历数组中 根节点位置
        for(int i = middleStart;i<= middleEnd;i++){
            if(middle[i] == pre[preStart]){
                endIndex = i;
                break;
            }
        }
        int leftOffset = endIndex - middleStart;
        if(leftOffset > 0){
            node.left = make(pre, preStart+1, preStart + leftOffset, middle,middleStart,endIndex -1);

        }
        int rightOffset = middleEnd - endIndex;
        if(rightOffset >0){
             node.right = make(pre, preStart+leftOffset+1, preEnd, middle, endIndex + 1, middleEnd);
        }
        
        return node;
    }
}

全部评论

相关推荐

10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
10-12 19:08
666 C++
花开蝶自来_:技能:听动物叫,让雪豹闭嘴
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务