请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
数据范围: 
要求: 空间复杂度
,时间复杂度 )
要求: 空间复杂度
如输入[1,2,4,5,3],[4,2,5,1,3]时,通过前序遍历的结果[1,2,4,5,3]和中序遍历的结果[4,2,5,1,3]可重建出以下二叉树:
所以对应的输出为[1,3,5]。
[1,2,4,5,3],[4,2,5,1,3]
[1,3,5]
二叉树每个节点的值在区间[1,10000]内,且保证每个节点的值互不相同。
function solve( xianxu , zhongxu ) { const root = buildTree(xianxu,zhongxu) const res = [] const stack = [] stack.push(root) while(stack.length){ let times = stack.length let tmp = [] for(let i = 0;i< times;i++){ let node = stack.shift() tmp.push(node.val) if(node.left) stack.push(node.left) if(node.right) stack.push(node.right) } res.push(tmp.pop()) } return res } function buildTree(xianxu,zhongxu){ if (!xianxu.length || !zhongxu.length) return let rootVal = xianxu[0] let rootIndex = zhongxu.indexOf(rootVal) let root = new TreeNode(rootVal) root.left = buildTree(xianxu.slice(1,1+rootIndex),zhongxu.slice(0,rootIndex)) root.right = buildTree(xianxu.slice(1+rootIndex),zhongxu.slice(rootIndex+1)) return root } function TreeNode(val){ this.val = val this.left = null this.right = null }
function reConstructBinaryTree(pre, vin) { if(pre.length === 0 || vin.length === 0) return null let i = vin.indexOf(pre[0]) let node = new TreeNode(pre[0]) node.left = reConstructBinaryTree(pre.slice(1, i+1), vin.slice(0, i)) node.right = reConstructBinaryTree(pre.slice(i+1), vin.slice(i+1)) return node } function solve(xianxu, zhongxu) { let pNode = reConstructBinaryTree(xianxu, zhongxu) let result = [] function dfs(pNode, level) { if(pNode === null) return if(result.length <= level) { result.push(pNode.val) } dfs(pNode.right, level+1) dfs(pNode.left, level+1) } dfs(pNode, 0) return result }
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 求二叉树的右视图 * @param xianxu int整型一维数组 先序遍历 * @param zhongxu int整型一维数组 中序遍历 * @return int整型一维数组 */ // 1、创建节点类型 function TreeNode(x) { this.val = x; this.left = null; this.right = null; } // 2、创建二叉树 function buildTree(xianxu, zhongxu) { if(xianxu.length === 0 || zhongxu.length === 0) { return null; } let root = new TreeNode(xianxu[0]); let index = zhongxu.indexOf(root.val); let leftPre = xianxu.slice(1, index + 1); let leftVin = zhongxu.slice(0, index); root.left = buildTree(leftPre, leftVin); let rightPre = xianxu.slice(index + 1); let rightVin = zhongxu.slice(index + 1); root.right = buildTree(rightPre, rightVin); return root; } // 3、输出二叉树的右视图 function printRight(root) { if(!root) { return []; } let res = []; let queue = [root]; let index = 0; while(queue.length) { let len = queue.length; for(let i=0; i<len; i++) { let node = queue.shift(); if(i === (len - 1)) { res[index] = node.val; index++; } if(node.left) { queue.push(node.left); } if(node.right) { queue.push(node.right); } } } return res; } function solve( xianxu , zhongxu ) { let root = buildTree(xianxu, zhongxu); let rightView = printRight(root); return rightView; } module.exports = { solve : solve };