BM41 输出二叉树的右视图

该博客主要介绍了如何利用先序遍历和中序遍历来重建二叉树,并通过层次遍历获取二叉树的右视图。代码中包含了重建二叉树和层次遍历的具体实现,最后将层次遍历的结果转化为二维数组返回。这种方法对于理解二叉树的遍历和结构具有一定的帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、题目

2、思路

        我没有思路。。哭!

3、代码

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 求二叉树的右视图
     * @param xianxu int整型一维数组 先序遍历
     * @param zhongxu int整型一维数组 中序遍历
     * @return int整型一维数组
     */
    
    ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
 
    public int[] solve(int[] xianxu, int[] zhongxu) {
        // write code here
        lists.add(new ArrayList<Integer>());
        TreeNode root = Go(xianxu, zhongxu);
        Go2(root, 0);
        ArrayList<Integer> list = new ArrayList<>();
        //将二叉树 层次便利的 每层的额最后一个 值存入新的 ArrayList 中 转化为 数组
        for (int i = 0; i < lists.size(); i++) {
 
            list.add(lists.get(i).get(lists.get(i).size() - 1));
 
        }
        int result[] = list.stream().mapToInt(Integer::valueOf).toArray();
        return result;
    }
 
    //此方法用来重建二叉树
    private TreeNode Go(int[] pre, int[] in) {
        if (pre.length == 0 || in.length == 0) {
            return null;
        }
        TreeNode node = new TreeNode(pre[0]);
        for (int i = 0; i < in.length; i++) {
            if (in[i] == pre[0]) {
                node.left = Go(Arrays.copyOfRange(pre, 1, i + 1), Arrays.copyOfRange(in, 0, i));
                node.right = Go(Arrays.copyOfRange(pre, i + 1, pre.length), Arrays.copyOfRange(in, i + 1, in.length));
                break;
 
            }
        }
 
        return node;
    }
 
    //此方法用来 二叉树的 层次遍历到 ArrayList<ArrayList<Integer>>中
    private void Go2(TreeNode root, int flag) {
        if (lists.size() < flag + 1) {
            lists.add(new ArrayList<Integer>());
        }
        lists.get(flag).add(root.val);
        if (root.left != null)
            Go2(root.left, flag + 1);
        if (root.right != null)
            Go2(root.right, flag + 1);
    }
  
    
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值