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

输出二叉树的右视图

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);
    }
}


全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务