请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
数据范围: 
要求: 空间复杂度
,时间复杂度 )
要求: 空间复杂度
如输入[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 TreeNode(x){
this.val=x
this.left=null
this.right=null
}
function build(pre,vin){
if(!pre.length||!vin.length) return
let root=new TreeNode(pre.shift())
let index=vin.indexOf(root.val)
root.left=build(pre,vin.slice(0,index))
root.right=build(pre,vin.slice(index+1))
return root
}
function solve( xianxu , zhongxu ) {
// write code here
//重建二叉树
let root=build(xianxu,zhongxu)
//怎末输出右视图,就是把每层的level最后一个元素输出一下
let a=[]
let b=[]
function level(root,l){
if(!root)return
i***efined) a[l]=[]
a[l].push(root.val)
level(root.left,l+1)
level(root.right,l+1)
}
level(root,0)
for(let i=0;i<a.length;i++){
b[i]=a[i][a[i].length-1]
}
return b
} /**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型一维数组 先序遍历
* @param zhongxu int整型一维数组 中序遍历
* @return int整型一维数组
*/
function solve( xianxu , zhongxu ) {
// write code here
//构建二叉树
const f = ((preorder,inorder)=>{
if(preorder.length <= 0 || inorder.length <= 0) return null;
let root = new TreeNode(preorder[0]);
let index = inorder.indexOf(root.val);
preorder.shift();
root.left = f(preorder, inorder.slice(0, index));
root.right = f(preorder, inorder.slice(index + 1));
return root;
});
let pRoot = f(xianxu,zhongxu);
//层序遍历
const res = [];
const que = [];
que.push(pRoot);
while(que.length > 0){
const len = que.length;
for(let i = 0; i < len; i++){
let tem = que.shift();
if(i === len - 1) res.push(tem.val);
if(tem.left) que.push(tem.left);
if(tem.right) que.push(tem.right);
}
}
return res;
}
module.exports = {
solve : solve
}; function solve( xianxu , zhongxu ) {
const root = buildTree(xianxu, zhongxu);
const rightView = getRightView(root);
return rightView;
}
function buildTree(xianxu, zhongxu) {
if (xianxu.length === 0) return null;
const root = new TreeNode(xianxu[0]);
const index = zhongxu.indexOf(root.val);
const lefts = zhongxu.slice(0, index);
const rights = zhongxu.slice(index + 1);
root.left = buildTree(xianxu.slice(1, lefts.length + 1), lefts);
root.right = buildTree(xianxu.slice(lefts.length + 1), rights);
return root;
}
function getRightView(root) {
const res = [];
let stack = [root];
while (stack.length) {
const rowLen = stack.length;
const newStack = [];
for (let i = 0; i < rowLen; i++) {
const node = stack[i];
if (i === stack.length - 1) res.push(node.val);
if (node.left) newStack.push(node.left);
if (node.right) newStack.push(node.right);
}
stack = newStack;
}
return res;
} /**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型一维数组 先序遍历
* @param zhongxu int整型一维数组 中序遍历
* @return int整型一维数组
*/
function TreeNode(val) {
this.val = val
this.left = null
this.right = null
}
function solve( xianxu , zhongxu ) {
// write code here
function createTree(xian,zhong){
if(xian.length==0){
return null;
}
let root = new TreeNode(null);
let middelIndex = zhong.indexOf(xian[0]);
root.val = xian[0];
let leftZ = zhong.slice(0,middelIndex);
let rightZ = zhong.slice(middelIndex+1);
let leftX = xian.slice(1,leftZ.length+1);
let rightX = xian.slice(leftZ.length+1);
root.left = createTree(leftX,leftZ);
root.right = createTree(rightX,rightZ);
return root;
}
const root = createTree(xianxu,zhongxu);
let arr = [];
function pushArr(root,i){
if(!root){
return;
}
arr[i] = root.val;
i++;
pushArr(root.left,i)
pushArr(root.right,i)
}
pushArr(root,0)
return arr;
}
module.exports = {
solve : solve
}; function solve( xianxu , zhongxu ) {
// write code here
//重建二叉树
function buildTree(pre, vin) {
if(pre.length == 0 || vin.length == 0) return null
let root = new TreeNode(pre[0]), i = vin.indexOf(pre[0])
root.left = buildTree(pre.slice(1, i+1), vin.slice(0,i))
root.right = buildTree(pre.slice(i+1), vin.slice(i+1))
return root
}
let root = buildTree(xianxu, zhongxu)
//dfs
if(!root) return []
let arr = []
dfs(root, 0 , arr)
return arr
function dfs(root, depth, res){
if(root){
if(res.length == depth){
res.push(root.val)// 当数组长度等于当前 深度 时, 把当前的值加入数组
}
dfs(root.right, depth +1 ,res) // 先从右边开始, 当右边没了, 再轮到左边
dfs(root.left, depth+1, res)
}
}
} /**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型一维数组 先序遍历
* @param zhongxu int整型一维数组 中序遍历
* @return int整型一维数组
*/
function solve( xianxu , zhongxu ) {
// write code here
let node = rebuild(xianxu, zhongxu);
// return rightView(node);
return rightViewDFS(node);
}
function TreeNode(val){
this.val = val;
this.left = null;
this.right = null;
}
function rebuild(preOrder, inOrder){
if(!preOrder.length || !inOrder.length) return null;
let val = preOrder[0],
node = new TreeNode(val);
let i = 0;
for(let len = inOrder.length; i < len; i++){
if(inOrder[i] === val) break;
}
node.left = rebuild(preOrder.slice(1, i + 1), inOrder.slice(0, i));
node.right = rebuild(preOrder.slice(i + 1), inOrder.slice(i + 1));
console.log(node)
return node;
}
function rightView(root){
if(!root) return [];
let res = [],
queue = [root];
while(queue.length){
let len = queue.length;
for(let i = 0; i < len; i++){
let node = queue.shift();
if(i === len - 1){
res.push(node.val);
}
if(node.left){
queue.push(node.left);
}
if(node.right){
queue.push(node.right)
}
}
}
return res;
}
function rightViewDFS(root){
let res = [];
if(!root) return res;
dfs(root, res, 0);
return res;
}
function dfs(node, res, depth){
if(!node) return;
if(res.length === depth){
res.push(node.val);
}
dfs(node.right, res, depth + 1);
dfs(node.left, res, depth + 1);
}
module.exports = {
solve : solve
};