代码随想录算法训练营第十六天| 513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树

61 阅读1分钟

513.找树左下角的值

相关链接:题目链接文章讲解 视频讲解

解题思路

层序遍历

代码实现

var findBottomLeftValue = function(root) {
    var queue = [[root,0]];
    const res =[];
    while(queue.length){
        const [ node,level] = queue.shift();
        if(res[level]){
            res[level].push(node.val);
        }else{
            res[level]=[];
            res[level].push(node.val);
        }
        if(node.left) queue.push([node.left,level+1]);
        if(node.right) queue.push([node.right,level+1]);
    }
    return res[res.length-1][0];
};

112. 路径总和

相关链接:题目链接文章讲解 视频讲解

解题思路

代码实现

var hasPathSum = function(root, targetSum) {
    if(!root){
        return false;
    }
    var isSame = false;
    var dfs = function(root,sum){
        console.log(root.val,sum)
        if(!root.left && !root.right){
            console.log(root.val,sum,targetSum);
            sum += root.val;
            if(sum === targetSum){
                isSame = true;
            }
        }else{
            if(root.left)  dfs(root.left,sum+root.val);
            if(root.right) dfs(root.right,sum+root.val);
        }
           
    }
   dfs(root,0);
   if(isSame===true){
        return true;
   }else{
        return false;
   }

};

113. 路径总和

相关链接:题目链接文章讲解 视频讲解

解题思路

代码实现

var pathSum = function(root, targetSum) {
    var res =[];
    if(!root) return res;
    var dfs = function(root,path,sum){
        if(!root.left && !root.right){
            path.push(root.val);
            if(sum + root.val ===targetSum){
                res.push(path);
                path=[];
            }
        }else{
            if(root.left) dfs(root.left,path.concat(root.val),sum + root.val);
            if(root.right) dfs(root.right,path.concat(root.val),sum + root.val);
        }
    }
    dfs(root,[],0);
    return res;
};

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

相关链接:题目链接文章讲解 视频讲解

解题思路

首先回忆一下如何根据两个顺序构造一个唯一的二叉树,相信理论知识大家应该都清楚,就是以 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。一层一层切下去,每次后序数组最后一个元素就是节点元素。

如果让我们肉眼看两个序列,画一棵二叉树的话,应该分分钟都可以画出来。 image.png

代码实现

var buildTree = function(inorder, postorder) {
     if(!postorder.length)  return null;
     var node = postorder.pop();
     var index = inorder.indexOf(node);
     const rootNode = new TreeNode(node);
     rootNode.left = buildTree(inorder.slice(0,index),postorder.slice(0,index));
     rootNode.right = buildTree(inorder.slice(index+1),postorder.slice(index));
     return rootNode;
};