链表LInkedList 是特殊化的 树Tree
树Tree 是特殊化 图Graph
树 和 图 的区别就在于 有没有环
二叉树
树的各种操作 一般是 递归, 而递归实质上就是在利用 栈机制,因此可以有两种方式构造栈
- 使用递归,让 JVM 形成 递归栈
- 手动构造栈
Stack<Node> stack = new Stack()<>;
但是,不管 手动 还是 自动,一定要确定好 递归出口。
递归中的小技巧:
由于递归中无法初始化局部变量,因此可以将 局部变量 放在 形参 中,可以达到同样的效果。
同时,函数的 形参 同样也可作为递归函数 传递返回值 的通道。
遍历树的策略:DFS 和 BFS
深度优先搜索(DFS)
在这个策略中,我们采用 深度
作为优先级,以便从跟开始一直到达某个确定的叶子,然后再返回根到达另一个分支。
深度优先搜索策略又可以根据根节点、左孩子和右孩子的相对顺序被细分为
- 前序遍历
- 中序遍历
- 后序遍历
宽度优先搜索(BFS)
我们按照高度顺序一层一层的访问整棵树,高层次的节点将会比低层次的节点先被访问到。
下图中的顶点按照访问的顺序编号,按照 1-2-3-4-5
的顺序来比较不同的策略。
本问题就是用宽度优先搜索遍历来划分层次:[[1], [2, 3], [4, 5]]。
二叉树的遍历,主要是取决于 根的访问顺序
- 前序 - 根 左 右
- 后续 - 左 根 右
- 中序 - 左 右 根
常见数据结构复杂度
数组排序算法时间和空间复杂度
动画演示树和图的工具
VisuAIgo