前端算法系列-二叉树04

63 阅读1分钟

513. 找树左下角的值

第一眼感觉用层序遍历会很简单

var findBottomLeftValue = function(root) {
    let queue = [root]
    let res = root.val
    while(queue.length > 0){
        let size = queue.length
        res = queue[0].val  
        for(let i=0;i<size;i++){
            let node = queue.shift()
            if(node.left) queue.push(node.left)
            if(node.right) queue.push(node.right)
        }
    }
    return res
};

递归就比较难了

var findBottomLeftValue = function(root) {
    //首先考虑递归遍历 前序遍历 找到最大深度的叶子节点即可
    let maxPath = 0, resNode = null;
    // 1. 确定递归函数的函数参数
    const dfsTree = function(node, curPath) {
    // 2. 确定递归函数终止条件
        if(node.left === null && node.right === null) {
            if(curPath > maxPath) {
            maxPath = curPath;
            resNode = node.val;
            }
        }
        node.left && dfsTree(node.left, curPath+1);
        node.right && dfsTree(node.right, curPath+1);
    }
    dfsTree(root,1);
    return resNode;
};

112. 路径总和

递归回溯,挺简单的

var hasPathSum = function(root, targetSum) {
    let res = false
    var fn = (root,num) => {
        if(!root) return 
        if(root && !root.left && !root.right){
            if(num + root.val === targetSum){
                res = true
            }
        }
        fn(root.left,num + root.val)
        fn(root.right,num + root.val)
    }
    fn(root,0)
    return res
};

113. 路径总和 II

var pathSum = function(root, targetSum) {
    let res = []
    let fn = (root,numArr) => {
        if(!root) return
        if(root && !root.left && !root.right){
            let temp = [...numArr,root.val]
            if(temp.reduce((acc,cur)=>{
                return acc + cur
            },0) === targetSum){
                res.push(temp)
            }
            return
        }
        fn(root.left,[...numArr,root.val])
        fn(root.right,[...numArr,root.val])
    }
    fn(root,[])
    return res
};

106. 从中序与后序遍历序列构造二叉树

这是自己写的第一版,虽然一遍过了,但是差点超时

var buildTree = function(inorder, postorder) {
        if(inorder.length === 1){
            return new TreeNode(inorder[0])
        }else if(inorder.length === 0){
            return null
        }
        let root = postorder.pop()
        let rootIndex = inorder.indexOf(root)
        let leftIn = inorder.slice(0,rootIndex)
        let rightIn = inorder.slice(rootIndex+1)
        let leftPo = postorder.slice(0,leftIn.length)
        let rightPo = postorder.slice(leftIn.length)
        return new TreeNode(root,buildTree(leftIn,leftPo),buildTree(rightIn,rightPo))

};

105. 从前序与中序遍历序列构造二叉树

前序和中序和上一题的思路一样

var buildTree = function(preorder, inorder) {
    if(preorder.length === 0) return null
    let node = preorder.shift()
    let nodeIndex = inorder.indexOf(node)
    let leftIn = inorder.slice(0,nodeIndex)
    let rightIn = inorder.slice(nodeIndex+1)
    let leftPre = preorder.slice(0,leftIn.length)
    let rightPre = preorder.slice(leftIn.length)
    return new TreeNode(node,buildTree(leftPre,leftIn),buildTree(rightPre,rightIn))
};