前一段时间项目比较紧张,就把力扣刷题停下来了,现在又开始继续刷题了。为什么要刷题呢?最主要的就是面试的时候想去大厂都逃不掉算法,还有就是作为一个程序员要走的更远算法是躲不开的。你不懂算法,数据结构计算机基础这些东西,在现在前端框架日新月异的时代。可能你学东西就要比别人慢,在这个时间就是金钱的世界你学的比别人慢,升值加薪就比别人慢一系列连锁反应就来了!所以赶紧刷起来
先说一下我的刷题顺序,刚开始的时候自己什么都不知道,就漫无目的的乱刷,可能今天做数组明天就又做了一道链表的题,可想而知收效甚微。o(╥﹏╥)o所以我就看了很多博客,想了解大佬是怎么刷题的,现总结如下:
练习算法最好从 树 开始,因为树的各类题目基本上都会用到递归算法,理解了递归思想,其他算法思想就能够更好的掌握,所以优先刷树、链表、二分查找、DFS、BFS等面试常考类型题;每个分类从Easy刷到Medium顺序刷;优先刷题号靠前的题目;优先刷点赞多的题目,刷到200道基本上就够了。我也是刚起步阶段,所以每天会把自己的刷题情况发博客来记录。
对于前两天力扣里面的三道树的遍历的题目中序遍历、前序遍历、后序遍历,今天就来小结一下二叉树的遍历:
中序遍历(左 根 右)
中序遍历是一种以上行顺序访问BFS所有节点的遍历方式,也就是以从小到大的顺序访问所有节点。中序遍历对应的就是对树进行排序操作让我们看一下代码实现:
this.inOrderTraverse = function(callback){
inOrderTraverseNode(root,callback) //{1}
};
inOrderTraverse方法接受一个回调函数作为参数,回调函数用来定义我们对遍历到的每个节点进行的操作。
var inOrderTraverseNode = function(node,callback){
if( !node ){
return
}
inOrderTraverseNode(node.left,callback)
callback(node.value)
inOrderTraverseNode(node.right,callback)
}
}
要通过中序遍历的方法遍历一棵树,首先要检查以参数形式传入的节点是否为null(这就是停止递归继续执行的判断条件),先序和后序遍历也需要先进行这个判断。
前序遍历(根 左 右)
this.preOrderTraverse = function(callback){
preOrderTraverse(root,callback) //{1}
};
var preOrderTraverseNode = function(node,callback){
if( !node ){
return
}
callback(node.value)
preOrderTraverseNode(node.left,callback)
preOrderTraverseNode(node.right,callback)
}
}
后序遍历(左 右 根)
this.postOrderTraverse = function(callback){
postOrderTraverse(root,callback) //{1}
};
var postOrderTraverseNode = function(node,callback){
if( !node ){
return
}
callback(node.value)
postOrderTraverseNode(node.left,callback)
postOrderTraverseNode(node.right,callback)
}
}
采用递归的方式对二叉树进行遍历呢,代码简洁但是效率上就差了一点,之后我们会通过非递归的方式来实现对二叉树的遍历,而上边这三段代码均应该作为模板记住,有很多关于二叉树的题目都是在此基础上衍生出来的。