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

输出二叉树的右视图

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

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 求二叉树的右视图
 * @param xianxu int整型一维数组 先序遍历
 * @param zhongxu int整型一维数组 中序遍历
 * @return int整型一维数组
 */
function solve(xianxu, zhongxu) {
    // write code here
    // 1. 先构造树结构,数组存储的方式有点难
    const root = buildTree(xianxu, zhongxu);
    // 2. 层序遍历
    const cengxu = traverseTree(root);
    // 3. rightView
    const res = rightView(cengxu);
    return res;
}

function rightView(vector) {
    const res = [];
    for(let i = 0; i < vector.length; i++) {
        const lastindex = vector[i].length - 1;
        res.push(vector[i][lastindex]);
    }
    return res;
}


// 层序遍历 需要依赖一个队列
function traverseTree(root) {
    if (!root) return;
    const queue = [],
        res = [];

    queue.push(root);

    while (queue.length) {
        let size = queue.length;
        const temp = [];
        while (size--) {
            const node = queue.shift();
            temp.push(node.val);

            if (node.left) {
                queue.push(node.left);
            }

            if (node.right) {
                queue.push(node.right);
            }
        }
        res.push(temp);
    }
    return res;
}

function buildTree(xianxu, zhongxu) {
    if (xianxu.length === 0) return;

    const root = {
        val: xianxu[0],
        left: undefined,
        right: undefined,
    };

    const rootInZhongIndex = zhongxu.findIndex((i) => i === root.val);

    const zleft = zhongxu.slice(0, rootInZhongIndex);
    const xleft = xianxu.slice(1, zleft.length + 1);
    root.left = buildTree(xleft, zleft);

    const xright = xianxu.slice(1 + xleft.length);
    const zright = zhongxu.slice(rootInZhongIndex + 1);
    root.right = buildTree(xright, zright);

    return root;
}

module.exports = {
    solve: solve,
};

给出一颗二叉树的前序和中序,可以构造出二叉树的结构。

打印二叉树的右视图就是打印二叉树层序遍历的最右边的数据。

构造二叉树结构,最简单的还是用树的链式结构,这样方便利用递归,解法逻辑简单。

层序遍历由于二叉树的结构,导致如果是遍历二叉树没办法同时保持左子树和右子树的值,同时还知道此时处于哪一层。所以而二叉树层序遍历需要依赖一个队列queue,每次把节点的值放入队列,记录当前队列的大小,每次从queue中取size大小的数出来,再将节点的左节点和右节点放入队列,循环往复,直至队列queue中没有值,我们就层序遍历完所有层了。文字有点乱的话,看一下traverseTree的代码就更好理解了。

总结,这道题我的做法就是:

  1. 构造(还原)二叉树
  2. 层序遍历二叉树
  3. 打印右视图
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-03 18:22
投了几百份简历,专业和方向完全对口,都已读不回。尝试改了一下学校,果然有奇效。
steelhead:这不是很正常嘛,BOSS好的是即便是你学院本可能都会和聊几句,牛客上学院本机会很少了
点赞 评论 收藏
分享
榕城小榕树:1200单休,我去干点啥别的不好
点赞 评论 收藏
分享
qq乃乃好喝到咩噗茶:院校后面加上211标签,放大加粗,招呼语也写上211
点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务