先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
正文
let res = [];
let queue = [root];
while(queue.length){
let len = queue.length;
let subRes = [];
while(len){
let cur = queue.shift();
subRes.push(cur.val);
if(cur.left) queue.push(cur.left);
if(cur.right) queue.push(cur.right);
len--;
}
res.push(subRes);
}
return res[res.length-1][0];
};
## 112 路径总和
题目链接/文章讲解/视频讲解:https://programmercarl.com/0112.%E8%B7%AF%E5%BE%84%E6%80%BB%E5%92%8C.html
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d2d00947c5e84eb2b4320423027482d9.png)
方法一:DFS递归,回溯,不是精简版的递归,体现了回溯思想(先减掉再加上,因为每一次遍历到底,也就是更改了cnt的值,如果这条路径不对,返回去需要更改路径,也就是说要把cnt复原)
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val=undefined ? 0 : val)
* this.left = (left=undefined ? null : left)
* this.right = (right=undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number} targetSum
* @return {boolean}
*/
var hasPathSum = function(root, targetSum) {
const traversal = (node,cnt) => {
//确定终止条件
//已经是叶子节点,且总和已经为0,则存在路径
if(node.left === null && node.right === null && cnt === 0){
return true;
}
//已经是叶子节点,但总和不为0,则不存在路径
if(node.left === null && node.right === null && cnt ! 0){
return false;
}
//单层循环逻辑
if(node.left){
cnt -= node.left.val;
if(traversal(node.left,cnt)) return true;
//回溯思想
cnt += node.left.val;
}
if(node.right){
cnt -= node.right.val;
if(traversal(node.right,cnt)) return true;
cnt += node.right.val;
}
return false;
}
if(root === null) return false;
//注意,这里传入的总和要已经减去根节点的值
return traversal(root,targetSum - root.val);
};
## 113 路径总和Ⅱ
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a94b8f85cd4946a98de6d84a1434120e.png)
方法一:递归
本题结合了112路径总和和257二叉树的所有路径,更多的是在112的基础上加了一个参数path
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val=undefined ? 0 : val)
* this.left = (left=undefined ? null : left)
* this.right = (right=undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number} targetSum
* @return {number[][]}
*/
var pathSum = function(root, targetSum) {
// 要遍历整个树找到所有路径,所以递归函数不需要返回值, 与112不同
const res = [];
const travelsal = (node,cnt,path) => {
if(cnt === 0 && node.left === null && node.right === null){
res.push([…path]); //不能写res.push(path),要深拷贝
return;
}
if(cnt ! 0 && node.left === null && node.right === null){
return;
}
if(node.left){
path.push(node.left.val);
travelsal(node.left,cnt - node.left.val,path);
path.pop(); //回溯
}
if(node.right){
path.push(node.right.val);
travelsal(node.right,cnt - node.right.val,path);
path.pop(); //回溯
}
return;
}
if(root === null) return [];
//把根节点放进路径
travelsal(root,targetSum - root.val,[root.val]);
return res;
};
## 106 从中序与后序遍历序列构造二叉树
题目链接/文章讲解/视频讲解:https://programmercarl.com/0106.%E4%BB%8E%E4%B8%AD%E5%BA%8F%E4%B8%8E%E5%90%8E%E5%BA%8F%E9%81%8D%E5%8E%86%E5%BA%8F%E5%88%97%E6%9E%84%E9%80%A0%E4%BA%8C%E5%8F%89%E6%A0%91.html
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d3a5ece422cb426b8996c88861f9c6ad.png)
**思路:其实思路核心都是要根据后序来知道根节点的值,然后以此来划分左子树的区间和右子树的区间。**
方法一:笨猪爆破组的方法,很详细
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6ba974585d6c4d7991b00e2b43f5913a.png)
方法一:笨猪爆破组
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val=undefined ? 0 : val)
* this.left = (left=undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {number[]} inorder
* @param {number[]} postorder
* @return {TreeNode}
*/
var buildTree = function(inorder, postorder) {
const map = {};
//把inorder数组内的节点值和对应索引先用map存起来,方便找mid的位置
for(let i = 0;i<inorder.length;i++){
map[inorder[i]] = i;
}
const helper = (iStart,iEnd,pStart,pEnd) => {
//指针交错了,返回null节点
if(pStart > pEnd || iStart > iEnd){
return null;
}
//根据后序数组里的最后一个值获取到根节点的值
const rootVal = postorder[pEnd];
//获取到根节点的值在中序数组中的位置,方便划分左子树和右子树
const mid = map[rootVal];
//获取到左子树的节点个数
const leftNodeNum = mid-iStart;
//创建根节点
const root = new TreeNode(rootVal);
//递归构建左子树
root.left = helper(iStart,mid-1,pStart,pStart+leftNodeNum-1);
//递归构建右子树
root.right = helper(mid+1,iEnd,pStart+leftNodeNum,pEnd-1);
return root;
最后
基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
不再深入研究,那么很难做到真正的技术提升。**
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-8V9Y8vFK-1713230041342)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!