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