【JS】输出二叉树的右视图

输出二叉树的右视图

http://www.nowcoder.com/questionTerminal/c9480213597e45f4807880c763ddd5f0

function TreeNode(val) {
  this.val = val;
  this.left = this.right = null;
}

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 求二叉树的右视图
 * @param xianxu int整型一维数组 先序遍历
 * @param zhongxu int整型一维数组 中序遍历
 * @return int整型一维数组
 */
function solve( xianxu , zhongxu ) {

  // 记录中序 val => idx
  let inOrder = new Map();
  for (let i = 0; i < zhongxu.length; i++) {
    inOrder.set(zhongxu[i], i);
  }

  // 重建二叉树
  function rebuildTree(preIdx, inLeft, inRight) {
    if (inLeft > inRight) return null;
    let val = xianxu[preIdx];
    let node = new TreeNode(val);
    let inIdx = inOrder.get(val);
    if (inLeft < inRight) {
      node.left = rebuildTree(preIdx + 1, inLeft, inIdx - 1);
      node.right = rebuildTree(preIdx + (inIdx - inLeft + 1), inIdx + 1, inRight);
    }
    return node;
  }

  let root = rebuildTree(0, 0, zhongxu.length - 1);
  let queue = [root];
  let res = [];

  // bfs
  while (queue.length) {
    let len = queue.length;
    let isPush = false;
    // 对于每一层做一次处理
    while (len--) {
      let node = queue.shift();
      // 只push一个值,因为是右视图
      if (!isPush) {
        res.push(node.val);
        isPush = true;
      }
      // 既然是右视图,那就是右节点优先
      node.right && queue.push(node.right);
      node.left && queue.push(node.left);
    }
  }

  return res;
}

module.exports = {
    solve : solve
};
全部评论

相关推荐

鼠鼠第一次实习,啥也不懂一直是自己一个人吃的饭,不会做工作老是被嫌弃,大人的世界是这样的吗?
我是星星我会发亮:好的mt有两种,一种愿意教你的,一种几乎什么活都不给你派让你很闲允许你做自己事情的
实习吐槽大会
点赞 评论 收藏
分享
05-09 14:45
门头沟学院 Java
点赞 评论 收藏
分享
06-23 11:28
门头沟学院 Java
牛客91966197...:也有可能是点拒绝的时候自动弹的话术
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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