写在前面
本篇全部集中在二叉树相关问题上,是参考东哥的思路进行的练习和思考。东哥有《labuladong 的算法小抄》以及宝藏微信公众号 labuladong,github 也有项目,自来水推荐购买和关注。
二叉树思考学习记录
Day3 二叉树迭代相关~
本篇聊的迭代有两方面的意思:
- 遍历二叉树不再使用递归函数的形式,而是使用迭代来遍历,不变的是“遍历”,迭代和递归只是为了进行“遍历”的手段而已。意义不大,只是卷起来了哈哈哈O(∩_∩)O~比较吃对栈的理解和操作。
- 对应 bfs 的思想,bfs 和 dfs 本质都在做穷举,很多问题都可以任选其一。但在某些特定问题上如无权最短路径问题,只有 bfs 能胜任。
Day3 练习
迭代的形式完成二叉树的遍历,注释出来具体在操作什么。
用 bfs 的方式完成以下题目:
完全用队列判断显得有点罗嗦了,其实也完全可以反转 list。这里反转的只有在取 val 的时候,而不是入队的时候。入队肯定都是从左到右的,不然下一层又要反过来。
同时用 DFS(递归遍历)方式和 BFS 方式完成下列题目: 其实岛屿问题跟传统图像处理里面的某些连通域操作有很大类似。
本问题可以通过直接修改“岛屿”来实现不重复访问避免陷入死循环,都是通过 bfs 或者 dfs 的次数,来实现岛屿数量的计数。还可以用并查集做,但颈椎告诉我不要再写了O(∩_∩)O哈哈~ bfs: dfs:
同数量问题很类似,只不过维护两个变量来求取最大面积,一个变量记录历史最大岛屿面积,一个变量记录当前岛屿面积的增长。岛屿面积的增长,在 bfs 是入队的时刻更新,在 dfs 是在 d 到它的时候更新。 bfs:
dfs:
Day3 的思考与补充
滑动拼图游戏 使用 bfs 的思路来做游戏,仍然可以考虑优化的地方:
- 状态的表示,题目中我仍然使用的是二维数组,还可以使用整型或字符串来表示状态,应该可以优化一些时间常数;而且二维数组也不让放进集合里面,状态空间太大的时候,记录状态防止重复访问也不方便,in 方法太慢了;
- 游戏难度增加,状态空间太大的时候,还可以考虑使用双向 bfs 来求解,还妹尝试写过,颈椎现在也不让写。
|