一、二叉树
1、二叉树的编号
- 对于一个数组tree[N]而言,我们如果把tree[1]作为根节点,那么tree[i]的左儿子节点坐标为tree[i * 2],右儿子坐标为tree[i *2+1]。这是一个非常重要的知识点。
例题博客:紫书p148例题6-6 小球下落(作者:maplegam)
思路:本题很容易就能想到暴力的思路,但是暴力的时间复杂度并不能让我们解决这一个问题,因此我们需要换一个思路去解决这个问题。书上提到:使用题目给出的编号i,当i为奇数时,它是往左走的第(i+1)/2个小球 。通过这条性质,我们可以通过不断判断i的奇偶性来判断小球是往左还是往右走。然后我们通过不断更新i和用一个变量k来判断走到了哪个点就可以得到最后的答案。
2、二叉树的BFS层次遍历
- 对于一棵二叉树,如果我们需要对二叉树进行按照树高依次进行层次遍历,我们需要使用bfs算法来进行操作。即使用队列数据结构从根节点开始入队。然后依次输出并且pop出队列中的队首元素,将它的所有子节点进行入队操作。
3、二叉树的DFS递归遍历(重难点)
- 与BFS相对应的遍历方式是DFS深度优先遍历,使用DFS可以优先找到二叉树的叶子节点,适合用来处理需要优先处理叶子节点的问题。
在这里还需要介绍一下递归遍历的3种形式:先序遍历、中序遍历、后序遍历
1.先序遍历:对于每一个节点T,遍历顺序为 T —> T的左子树 —>T的右子树。
2.中序遍历:对于每一个节点T,遍历顺序为 T的左子树 —> T —>T的右子树。
3.后序遍历:对于每一个节点T,遍历顺序为 T的左子树 —> T的右子树 —>T。
在这里,我们可以通过中序排列与后序排列求出目标二叉树。而通过前序排列和后序排列求出来的二叉树是不唯一的,感兴趣可以自行查找资料。
求法步骤:
1.通过后序排列的最后一个元素得到根节点。
2.寻找中序排列中根节点的位置可以得到二叉树的左右子树中分别有哪些元素。
3.通过后序排列,从后往前查找到左子树元素中出现的第一个元素即为左子树的根节点,递归继续求左子树的左子树的根节点…直到找到叶子节点。
4.通过后序排列,从后往前查找到右子树元素中出现的第一个元素即为右子树的根节点,递归继续求右子树的左子树(没写错,就是左子树)的根节点…直到找到叶子节点。
样例如图,红色数字为节点上方数组中元素在后序排列中出现的最右边的元素
建树的遍历顺序如图
例题博客:紫书p157 6-9 天平(作者:浑水摸鱼拒绝996福报)
例题博客:紫书p159 6-10 下落的树叶(作者:Barsaker)
4、二叉树衍生
在实际比赛以及题目中,我们往往会遇到一些不是二叉树的树,但是他们也是有规律的,如四分树。这个时候就需要用二叉树的思路进行拓展思考找到解决方案。
例题博客:紫书p160 6-11 四分树(作者:Basaker)
二、欧拉图
1、定义
- 通过图中所有边恰好一次且行遍所有顶点的通路称为欧拉通路。
- 通过图中所有边恰好一次且行遍所有顶点的回路称为欧拉回路。
- 具有欧拉回路的无向图或有向图称为欧拉图。
- 具有欧拉通路但不具有欧拉回路的无向图或有向图称为半欧拉图。
非形式化地讲,欧拉图就是从任意一个点开始都可以一笔画完整个图,半欧拉图必须从某个点开始才能一笔画完整个图。
2、性质
- 欧拉图中所有顶点的度数都是偶数。
- 若图是欧拉图,则它为若干个环的并,且每条边被包含在奇数个环内。
3、判定定理
- 对于无向图 G,G是欧拉图当且仅当 G是连通的且没有奇度顶点。
- 对于无向图 G ,G是半欧拉图当且仅当 G是连通的且 中恰有 0 个或 2 个奇度顶点。
- 对于有向图 G ,G是欧拉图当且仅当 G的所有顶点属于同一个强连通分量且每个顶点的入度和出度相同。
- 对于有向图 G , G是半欧拉图当且仅当
1.如果将 G 中的所有有向边退化为无向边时,那么 G 的所有顶点属于同一个连通分量。
2.最多只有一个顶点的出度与入度差为1 。
3.最多只有一个顶点的入度与出度差为1 。
4.所有其他顶点的入度和出度相同。
例题博客:紫书p169 6-16 单词(作者:Barsaker)
作者:Avalon Demerzel,喜欢我的博客就点个赞吧,更多知识点请见作者专栏《图论与数据结构》与《紫书学习笔记》