| 算法&数据结构
在 2. 数组、链表、跳表 —— Ficow 陪你学算法和数据结构 中,Ficow 和您分享了自己的学习笔记。之前学习的链表是一种常见的一维数据结构,但是它的查询时间复杂度较高,所以科学家发明了跳表来解决这个问题。
在利用跳表进行加速的过程中,核心的思想就是 升维
。接下来,让我们开始学习常见的二维数据结构:树
和 图
。
在开始阅读后文之前,我强烈建议您学习覃超老师在 极客时间 上开设的 算法训练营体验课,我已经亲身学习过并推荐给了朋友、同事们。
该课程的内容主要是以视频为主,质量非常高,而且短小精悍。主要涉及:
截止 Ficow 创作此文当日,该课程售价还是 9.9 元,性价比还是挺高的。极客时间的新用户还可以免费领取,有效期是一周。赶快行动吧~
因为本文属于 Ficow 陪你入门
系列文章,所以 Ficow 也会记录自己的学习历程,并和您分享我自己的 学习笔记。欢迎您留言和我交流,大家共同进步!
如果链表的结点拥有多个 next 指针,这时候的链表就变成了一棵树!
上图中,A 结点为树的根结点
,B、C结点分别为 A 结点的左子结点
和右子结点
。同时,树还分了层
,比如图中的 level 0, level 1, …
二叉树是最常见的树,每个结点最多
拥有两个子结点。
树和图最关键的差别在于是否存在环
。如果不存在环,就是树;如果存在环,就是图。
可以这样理解:链表就是特殊化(每个结点最多只有一个子结点)的树,树就是特殊化(不存在环)的图。
主要分为:前序、中序、后序:
基于 Python 的示例代码(递归调用,非常简短):
根据树的定义,其没办法进行有效的循环,所以常见的树的遍历方式为递归。
非要进行循环遍历,可以采用 BFS(广度优先遍历)算法 来强制进行遍历,但是写法比递归调用更复杂。
在普通的树(结点中的值是无序的)中查找特定的值,就需要遍历所有的结点,时间复杂度为 O(n)。通常我们会把树中的值按照某种顺序来进行组织,在查找的时候就会更加高效。
请注意上图中黄色高亮部分的内容! 所有结点
!!!在比较的时候,要比较左子树中所有的结点,而不是单个左子结点!!!
实际的二叉搜索树示例:
Demo:https://visualgo.net/zh/bst
以上操作的时间复杂度都为:O(logn)。
不过,有一种特殊情况,树会退化为一个链表
。此时,查询操作的时间复杂度由 O(logn)
变为 O(n)
:
如何解决这个问题呢?可以考虑使用 平衡二叉树。
二叉树的中序、先序、后序遍历:
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
https://leetcode-cn.com/problems/binary-tree-preorder-traversal/
https://leetcode-cn.com/problems/binary-tree-postorder-traversal/
N叉树的先序遍历:
https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal/
N叉树的层遍历(需要用到BFS广度优先搜索算法):
https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal/
多种解法
都写下来,最后再去比较并找出最好的解法;特殊情况
);耗时
和时间复杂度
;5遍
,5遍
,5遍
!!!千万不要只刷一遍!!!
有同事或者朋友说过,这些东西平时根本没有用到过,学了有什么用?
然而,这只是自己目前的工作没有用到而已,哪里可以保证以后的工作里面用不到呢?除非,我们一辈子都重复做一样的工作,不然就有可能在某一天需要用到这些东西。比如:去更优秀的公司工作,我们就经常需要造轮子,而这个时候就需要用到这些知识。
再者,学习这些数据结构可以学习其设计思路,再遇到类似的问题时就可以参考这种思路来高效地解决自己遇到的问题。更何况,在练习这些数据结构时,自己的编程技能也可以得到提升。有时候,我们就是容易忽略这些看不到的好处。
不管怎样,如果您热爱编程、热爱您所做的软件开发工作,那么提升基本功一定是利大于弊的。技多不压身,是不是~
参考内容:
极客时间
算法训练营体验课
LeetCode
LeetCode - 中文站
觉得不错?点个赞呗~
本文链接:3. 树、二叉树、二叉搜索树 —— Ficow 陪你学算法和数据结构
转载声明:本站文章如无特别说明,皆为原创。转载请注明:Ficow Shen's Blog