首页 > 试题广场 >

输出二叉树的右视图

[编程题]输出二叉树的右视图
  • 热度指数:47892 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图

数据范围:
要求: 空间复杂度 ,时间复杂度

如输入[1,2,4,5,3],[4,2,5,1,3]时,通过前序遍历的结果[1,2,4,5,3]和中序遍历的结果[4,2,5,1,3]可重建出以下二叉树:

所以对应的输出为[1,3,5]。
示例1

输入

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

发表于 2022-08-03 09:27:41 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 求二叉树的右视图
 * @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
};

发表于 2021-07-25 14:10:49 回复(0)
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;
}

发表于 2021-04-08 19:27:55 回复(0)
JS 
采用两次递归 第一次构建树,第二次遍历树赋值 先给数组赋值树的左边,然后右边 右边的值会覆盖左边
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 求二叉树的右视图
 * @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
};


发表于 2021-01-23 14:04:29 回复(0)
右视图的两种方法 dfs bfs
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)
        }
    }
}

编辑于 2021-07-13 11:03:04 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 求二叉树的右视图
 * @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
};

发表于 2021-01-04 10:33:50 回复(0)