首页 > 试题广场 >

输出二叉树的右视图

[编程题]输出二叉树的右视图
  • 热度指数:48221 时间限制: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 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
}

发表于 2022-11-07 11:06:56 回复(0)
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
}

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

发表于 2021-07-20 15:09:15 回复(0)