DFS小结

DFS

        通过一些leetcode上面的题目, 总结出以下类型的题目;

  • 树先序遍历
  • DFS + 回溯
  • DFS + 记忆化
  • DFS + 减枝
  • DFS 求最短路
  • DFS 求联通块儿

先序遍历

        过于简单, 看看数据结构都能懂的。

题目

DFS + 回溯

        比较典型的问题是 迷宫, 八皇后 等问题, 也比较简单。

        当此题如果是判断某种情况存不存在, 则判断到存在的时候立马停止掉后续的所有DFS。

题目

DFS + 记忆化

        DFS过程当中同一个 节点的 状态可以多次进入, 而多次进入的需要求得结果均可使用第一次求得的结果, 这样能节省大量的时间。

模板
T dfs(...)
{
    if 子节点已经记载:
        求得当前顶点所对应的值
    else
        dfs(子节点)
        再求得当前顶点所对应的值

    //此处记载当前顶点对应的值。
}
题目

给定一个整数矩阵,找出最长递增路径的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。

输入: nums = 
[
  [9,9,4],
  [6,6,8],
  [2,1,1]
] 
输出: 4 
解释: 最长递增路径为 [1, 2, 6, 9]。
分析

        当DFS过程当中, 记录下当前DFS过程当中每个顶点的最长上升长度, 当其余DFS过程再次进入这些顶点的时候, 能够直接使用而不用在递归了。


DFS + 减枝

        根据先前DFS路径当中求得的某些结果, 判断当前DFS是否继续进行下去。


DFS求最短路径

        列出如下三种情况求一个顶点到剩余所有顶点的最短距离, 求一个顶点最多只能经过K条边到剩余顶点的最短距离, 求一个顶点最多只能经过K条边到指定顶点的最短距离, 并作出 减枝条件的 对比。

题目1

编号从1-n的一个有向图, 求编号为1的顶点到其他顶点之间的最短距离。

分析

        当DFS过程当中发生一个顶点二次进入的时候, 减枝方法为: 只需判断 先前DFS得出的 1 到 当前顶点距离, 和 当前DFS得出的 1 到 当前顶点的距离即可, 前者大, 则继续DFS, 后者大, 则终止当前DFS。

1

题目2

顶点编号从1-n的有向图, 求出顶点1, 经过k条边所能到达的顶点的最短距离。

分析

        当DFS过程当中发生一个顶点的二次进入的时候, 不能再使用题目一当中的减枝条件了, 因为即使 1 到 当前顶点的距离比先前DFS计算的大, 但是可能 此 DFS 到当前顶点的经过的边数少, 能到达先前DFS过程中未能达到的顶点, 因此减枝条件为: 如果到达此顶点时经过的边数少于先前DFS到达此顶点时的边数, 则继续DFS, 反之 则 需要比较两次的DFS的距离, 此次距离小才能继续DFS, 否则减枝。

2

题目3

有 n 个城市通过 m 个航班连接。每个航班都从城市 u 开始,以价格 w 抵达 v。

现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst 最多经过 k 站中转的最便宜的价格。 如果没有这样的路线,则输出 -1。

示例 1:
输入: 
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src = 0, dst = 2, k = 1
输出: 200

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/
cheapest-flights-within-k-stops
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析

        当有K约束时候, 需要限定DFS的路径(深度) 不能超过K的同时, 减枝方法应该修改为: 如果当前路径长度已经大于先前 DFS 累计的长度, 则终止此条DFS路径(减枝非必须, 为了不超时)。
3

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树是一种常见的数据结构,它由节点组成,每个节点最多有两个子节点,通常称为左子节点和右子节点。在进行需求分析时,对二叉树的操作小结主要包括以下几个关键点: 1. **插入操作**: - 插入一个新节点:需要确定节点的位置,通常是按照特定的规则(如比较大小、值或根据某种策略),使其成为左孩子或右孩子。 - 保持平衡:如果是自平衡二叉搜索树(如AVL树或红黑树),还需要保证插入后树的平衡性。 2. **删除操作**: - 删除指定节点:需要找到要删除的节点,可能涉及子节点的替换或重新调整其父节点的指针。 - 避免空悬:删除节点后,可能需要处理空指针的情况,以及确保树的结构完整性。 3. **查找操作**: - 查找指定元素:从根节点开始,按需遍历左子树或右子树,直到找到目标元素或确定不存在。 - 遍历算法:包括前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根)等。 4. **修改操作**: - 修改节点值:定位到目标节点后,更新其值。 - 结构修改:如调整子树结构(如旋转操作),可能涉及到整个树的重新布局。 5. **统计操作**: - 计算节点数:用于获取树的高度、宽度、叶子节点数等。 - 深度优先遍历(DFS)和广度优先遍历(BFS)统计信息。 6. **遍历序列**: - 生成遍历序列:理解并实现前序、中序和后序遍历,以及层序遍历(从上到下逐层处理)。 在进行需求分析时,除了了解这些基本操作外,还需要考虑时间复杂度和空间复杂度,因为二叉树的操作效率往往取决于树的形状。此外,性能优化和错误处理也是重要考虑因素。对于更复杂的二叉树结构,如堆、优先队列等,相应的操作需求也会有所不同。如果你有具体的二叉树应用场景,比如图算法或数据库索引,需求可能会更加细致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值