python算法之深度优先遍历算法(二叉树、怎么抓住小偷源程序)

本文介绍了深度优先遍历算法在图论中的应用,详细阐述了二叉树的类型及其遍历方法。同时,通过解决抓小偷问题,展示了如何利用深度优先遍历来求解最优路径,给出了具体的Python源代码实现。
摘要由CSDN通过智能技术生成

深度优先遍历

深度优先遍历问题一定要按照规则尝试所有的可能才行。
深度优先遍历算法是经典的图论算法,从某个节点v出发开始进行搜索,不断搜索直到该节点的所有边都被遍历完。当节点v的所有边都被遍历以后,深度优先遍历算法则需要回溯到v的前驱节点,来继续搜索这个前驱节点的其他边。

如果还存在尚未遍历的节点,则深度优先遍历算法将会按照同意的规则从这些剩下的节点中选择一个节点在重复同样的遍历过程。这样的搜索过程从最开始的节点一直持续到最后一个节点的所有边都遍历完。

二叉树

二叉树有几个特殊的类型:空二叉树、满二叉树、完全二叉树、完美二叉树、平衡二叉树。

  • 空二叉树有零个节点。
  • 完美二叉树(每一层的节点都是满的。):

在这里插入图片描述

  • 满二叉树:

  • 在这里插入图片描述
    每一个节点都有零或两个子节点,也就是说,没有只有一个子节点的节点。

  • 完全二叉树:

  • 在这里插入图片描述
    除了最后一层,每一层的节点都是满的,并且最后一层的节点全部从左排序。

二叉树的相关术语:

术语 解释
节点的度为节点的子树个数
叶子节点 度为零的节点
分支节点 度不为零的节点
孩子节点 节点下的两个子节点
双亲结点 节点上一层的源头节点
兄弟节点 拥有同一个双亲节点的节点
二叉树的源头节点
深度 二叉树中节点的层的数量

二叉树的遍历序列

二叉树有三种遍历序列:DLR(先序)、LDR(中序)、LRD(后序)。
遍历的意思是不重复的走遍二叉树的所有节点。
L:左子树。R:右子树。D:跟。
先、中、后代表的是根节点的位置。

在这里插入图片描述

DLR代表先遍历根,在遍历左子树,最后遍历右子树。以DLR节点访问顺序:1-2-4-5-3-6-7
LDR代表先遍历左子树,在遍历根,最后遍历右子树。以LDR节点访问顺序:4-2-5-1-6-3-7
LRD代表先遍历左子树,在遍历右子树,最后遍历根。以LRD节点访问顺序:4-5-2-6-7-3-1

抓小偷问题

有一个绝顶狡猾的小偷瞄准了一个高档小区,这个小区的别墅以二叉树的结构坐落,除了第一栋别墅,每一栋别墅都与另一栋“源头”别墅链接。一旦小偷闯入两栋相接的别墅,警铃就会被触发。圆圈里的数字代表财产,小偷已经计划好了路线,准备在不触发警报的前提下偷最多的钱。别墅小区的保安部门最近得到了风声,说有一个世纪大盗瞄上了别墅区,所以保安打算在小偷的必经之路上布置警卫,不动声色的抓住小偷,问题是小偷会怎样选择路线呢?
小区模型:
小区模型

解题:

把二叉树先分层,然后考虑不同的选择方案:
在这里插入图片描述

在每一个节点,小偷都要做一个选择:偷还是不偷。

让我们给每个节点两个值:偷的到的钱和不偷的到的钱。每一个节点旁边都有:偷0,与不偷0两个值。
在这里插入图片描述

上移一层,设节点2与节点3的值。在节点2,如果偷,小偷将会得到4万元,但与节点4与节点5的钱无缘;如果不偷,小偷可以偷盗4与5节点的钱,得到4万元。再看节点3,如果偷,小偷得到5万元;如果不偷,小偷得到节点6的1万元。

在这里插入图片描述

设根节点1的值。如果偷,将会得到节点1的3万元、节点4与节点5的4万元,以及节点6

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黎明之道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值