| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 《算法笔记》读书记录DAY_34 -> 正文阅读 |
|
[数据结构与算法]《算法笔记》读书记录DAY_34 |
CHAPTER_9? 提高篇(3)——数据结构(2)9.3.4 从树的遍历看DFS和BFS深度优先搜索与先根遍历 回忆树的先根遍历,我们会发现先根遍历就是DFS的过程。实际上,对所有合法的DFS过程,都哦可以把他画成树的形式,此时递归边界等价于树的叶子节点,而分岔口等价于树的非叶子节点。 于是我们可以从中得到一些启发:碰到一些可以用DFS的题目,不妨把一些状态作为树的结点。然后问题就会转化为对树的先根遍历。如果想要得到树的某些信息,也可以借用DNFS以深度作为第一关键词进行遍历。例如求解叶子节点的带权路径和时就可以把到达叶子节点作为一条路径结束的判断。 广度优先搜索与层序遍历 树的层序遍历,和BFS同样有着相同的思想。对于所有合法的BFS求解过程,也可以像DFS那样画出一棵树,并且将其转化为树的层次遍历。 下面我们通过一个例题来练习这一思想。 题目: 给定一棵树和每个节点的权值,求所有从根节点到叶子节点的路径中,使得每条路径上的节点权值之和等于给定常数S的路径。如果有多条这样的路径,则按路径非递增的顺序输出。其中路径大小是指,如果两条分别为a1-a2-...-ai-an与b1-b2-...-bi-bm,且有a1=b1,a2=b2,...,ai-1=bi-1成立,但ai>bi,则称第一条路径比第二条路径大。
输入格式:
输出格式:
输入样例:
输出样例:
思路: 我们采用树的静态写法来存储节点,并根据输入格式来将节点连接成树。然后设置int型数组path记录递归过程中产生的节点编号。然后开始DFS递归,参数有3个:当前访问节点index、当前路径节点个数nodeNum、当前权值和sum。递归过程如下: (1)如果sum>S,直接退出; (2)如果sum==S且当前节点为叶子节点,说明已经达到符合条件的路径,输出path中所有数? ? ? ? ? ? ? ?据;如果sum==S但当前不是叶子节点,直接退出; (3)如果sum<S,说明还可以往下递归。遍历当前节点的所有子节点,对每一个子节点将其存入? ? ? ? ? ?path,然后往下递归。 通过上面的算法,我们能将所有权值和等于S的路径输出。但是,我们还没有解决路径的排序输出问题。路径排序输出的方法十分巧妙,我们在读入每个节点的所有子节点之后(即输入每行节点的具体信息之后),对该节点的vector进行非递减排序。通过这么排序,DFS的输出路径就自然而然地变为非递减排序路径了。(不妨手动模拟vector排序后的DFS体会其过程) 参考代码:?
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 8:49:33- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |