【新视角】输出二叉树的右视图

求解代码

java 复制代码
// 存储最终结果:key = 二叉树的层级(根节点在第0层),value = 该层级【最右侧】的节点值
    private HashMap<Integer, Integer> ans = new HashMap<>();
    // 预处理哈希表:key=中序数组的节点值,value=该值在中序数组的下标
    private HashMap<Integer, Integer> map = new HashMap<>();
    // 前序数组的全局遍历指针:按「根→左→右」的前序规则,依次取当前递归层的根节点,取完自增
    private int level = 0;
    
    public void buildTree(int[] preOrder, int[] inOrder, int left, int right, int i) {
        
        if (left > right) {
            return;
        }
        // 按前序顺序取根节点,通过哈希表拿到根节点在中序数组的下标index
        int index = map.get(preOrder[level++]);
        // 递归构建左子树,中序区间[left, index-1],子节点层级 = 父层级+1
        buildTree(preOrder, inOrder, left, index - 1, i + 1);
        // 递归构建右子树,中序区间[index+1, right],子节点层级 = 父层级+1
        buildTree(preOrder, inOrder, index + 1, right, i + 1);
        // 存入当前节点到对应层级,后存的节点会覆盖先存的 → 最终保留该层最右侧节点
        ans.put(i, inOrder[index]);
    }    



    public int[] solve (int[] preOrder, int[] inOrder) {
        for(int i=0;i<inOrder.length;i++){
            map.put(inOrder[i], i);
        }

        buildTree(preOrder,inOrder,0,preOrder.length-1,0);

        int[] temp = new int[ans.size()];

        for(int i=0;i<ans.size();i++){
            temp[i]=ans.get(i);
        }
        return temp;


    }

小贴士

解释一下这行代码ans.put(i, inOrder[index]);可以拿到「每层最右侧」的节点:

因为在递归时,是先递归构建左子树,再递归构建右子树,这个顺序意味着:在同一层级中,「左侧节点」会被先处理,「右侧节点」被后处理。

对于哈希表来说,相同key的put操作,会覆盖原值,在同一层级中,不管有多少个节点,最终只会存最后一次 put 的那个值

所以,同一层级的右侧节点一定是最后一个被 put 的,所以最终ans.get(i)拿到的,一定是「第 i 层最右侧的节点值」。

相关推荐
努力学算法的蒟蒻2 小时前
day79(2.7)——leetcode面试经典150
算法·leetcode·职场和发展
2401_841495642 小时前
【LeetCode刷题】二叉树的层序遍历
数据结构·python·算法·leetcode·二叉树··队列
2401_841495642 小时前
【LeetCode刷题】二叉树的直径
数据结构·python·算法·leetcode·二叉树··递归
我是咸鱼不闲呀2 小时前
力扣Hot100系列19(Java)——[动态规划]总结(上)(爬楼梯,杨辉三角,打家劫舍,完全平方数,零钱兑换)
java·leetcode·动态规划
铉铉这波能秀3 小时前
LeetCode Hot100数据结构背景知识之列表(List)Python2026新版
数据结构·leetcode·list
仟濹4 小时前
算法打卡 day1 (2026-02-06 周四) | 算法: DFS | 1_卡码网98 可达路径 | 2_力扣797_所有可能的路径
算法·leetcode·深度优先
YuTaoShao5 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展
VT.馒头5 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
老鼠只爱大米7 小时前
LeetCode经典算法面试题 #46:全排列(回溯、交换、剪枝等五种实现方案详细解析)
算法·leetcode·剪枝·回溯·全排列·stj算法
im_AMBER8 小时前
Leetcode 114 链表中的下一个更大节点 | 删除排序链表中的重复元素 II
算法·leetcode