Python 刷题笔记:深度优先搜索专题

本文详细介绍了深度优先搜索算法(DFS),并通过三个LeetCode题目(相同的树、对称二叉树、二叉树的最大深度)阐述了如何在二叉树问题中使用DFS。通过递归实现DFS,对每个节点进行比较,从而解决各种二叉树相关问题。文章强调了DFS在理解和应用递归上的帮助,同时总结了DFS在实际问题中的解决思路。
摘要由CSDN通过智能技术生成

今天来接触下专业术语——深度优先搜索算法(英语:Depth-First-Search,DFS)

深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。

深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。
链接:https://leetcode-cn.com/tag/depth-first-search/
来源:力扣(LeetCode)

这里提到,该算法多用于遍历或搜索树或图,那么以二叉树为例,该算法即尽可能的从根节点向下直到叶节点才结束,到达叶节点后再由根节点重新向下延伸。

但是,怎么实现在我们到达叶节点时回到根节点来重新开始呢?初接触,我的理解是通过递归来实现。在对根节点的函数中调用关于其子节点的函数,以此建立父子间的关联;同时其子节点不止一个的话,那么所谓的回溯其实也就通过递归同步实现了。

举三道 LeetCode 题目为例,看看它们是如何实现深度优先搜索的吧!

题目一

第 100 题:相同的树

难度:简单

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:
输入:       1         1
          / \       / \
         2   3     2   3
        [1,2,3],   [1,2,3]
输出: true

示例 2:
输入:      1          1
          /           \
         2             2
        [1,2],     [1,null,2]
输出: false

示例 3:
输入:       1         1
          / \       / \
         2   1     1   2
        [1,2,1],   [1,1,2]
输出: false

#来源:力扣(LeetCode)
#链接:https://leetcode-cn.com/problems/same-tree

题目分析

既然要深度优先搜索,那么要从根节点起一直到不能再向下子节点为止,这么产生一条链;比较两个二叉树相同,那么只要保证生成这条链的过程中每个节点都是相同的即可。

思路很简单,到代码怎么实现呢?因为这题目是检测两棵二叉树是否相同,自然会定义检测函数。二叉树是由根节点和子树组成的,检测两棵二叉树是否相同,我们保证根节点相同的情况下,检查子树是否相同即可——注意,检查子树,又可以调用我们定义的检测函数,以此形成递归用法,这样通过递归便可实现深度优先搜索了。

代码实现

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值