请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
数据范围: 
要求: 空间复杂度
,时间复杂度 )
要求: 空间复杂度
如输入[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
};