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

输出二叉树的右视图

https://www.nowcoder.com/practice/c9480213597e45f4807880c763ddd5f0

不构建树,而利用递归的方式来得到右视图
重点有:
1.层数数组layer对应先序数组的原因是右视图的本质是每层的最右节点,而先序遍历保证每层最右节点出现在后面
2.递归的边界条件的判定是取决于我们如何定义左右子树的边界,这里容易出错
3.map用来加速每次查找当前根节点在中序数组中的下标
import java.util.HashMap;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 求二叉树的右视图
     *
     * @param xianxu  int整型一维数组 先序遍历
     * @param zhongxu int整型一维数组 中序遍历
     * @return int整型一维数组
     */
    public int[] solve(int[] xianxu, int[] zhongxu) {
        // write code here
        int n = xianxu.length;
        // 特殊情况考虑
        if (n == 0) {
            return new int[0];
        }
        // map 加速在中序数组中查找当前根节点
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < n; ++i) {
            map.put(zhongxu[i], i);
        }
        int max = 1;
        int[] layer = new int[n];
        recur(xianxu, zhongxu, 0, n - 1, 0, n - 1, map, layer, 1);
        for (int i = 0; i < n; ++i) {
            max = Math.max(max, layer[i]);
        }
        int[] res = new int[max];
        // 先序数组中每个节点的层数记录在layer中,此时直接遍历先序数组把下标较大的数值放到对应层数(返回数组中为层数减一)上
        for (int i = 0; i < n; ++i) {
            res[layer[i] - 1] = xianxu[i];
        }
        return res;
    }

    /**
     * 递归函数recur
     *
     * @param pre   先序数组
     * @param in    中序数组
     * @param p1    当前左子树的先序数组中的左边界
     * @param p2    当前左子树的先序数组中的右边界
     * @param i1    当前右子树的先序数组中的左边界
     * @param i2    当前右子树的先序数组中的右边界
     * @param map   存储中序数组中 数值-下标
     * @param layer 存储先序数组的对应层数
     * @param cur   当前节点的层数
     */
    public void recur(int[] pre, int[] in, int p1, int p2, int i1, int i2, HashMap<Integer, Integer> map, int[] layer, int cur) {
        // 边界条件,取决于后面的边界的取法,如p1,i1的赋值不同这里也会有不同
        if (p1 > p2 || i1 > i2) {
            return;
        }
        // 当前节点在中序数组的下标
        int h = map.get(pre[p1]);
        // 存储当前节点的层数
        layer[p1] = cur;
        // 以当前节点为根节点分别进行左右子树的递归,注意边界的取法影响边界的判断
        recur(pre, in, p1 + 1, p1 + (h - i1), i1, h - 1, map, layer, cur + 1);
        recur(pre, in, p2 - (i2 - h) + 1, p2, h + 1, i2, map, layer, cur + 1);
    }
}


全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:46
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:28
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务