深度优先遍历
深度优先遍历问题一定要按照规则尝试所有的可能才行。
深度优先遍历算法是经典的图论算法,从某个节点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