二叉树:深度优先遍历与广度优先遍历(及其Python实现)
二叉树:深度优先遍历与广度优先遍历(及其Python实现)
本问记录二叉树的深度优先遍历算法和广度优先遍历算法的特点及其python实现。
1 深度优先遍历
深度优先遍历算法包括先序遍历、中序遍历和后续遍历。
1.1 深度优先遍历顺序
我们根据下图只有3个节点的二叉树说明深度优先遍历顺序。
(各节点分别标上序号)
- 先序遍历:0→1→2
- 中序遍历:1→0→2
- 后序遍历:1→2→0
注意主要差别在于节点0在排序中的位置,节点1和节点2的相对位置是不变的(1在前,2在后)。
一般情况下的二叉树,如下图所示:
(各节点分别标上序号)
以先序遍历为例:
我们首先从最上面开始看,将0节点的左子树包含的节点当作一个整体(1、3、4、7、8、9),记为整体1;右子树包含的节点也当作一个整体(2、4、6),记为整体2;所以此时,先序遍历顺序为:
- 0 → 整体1 → 整体2
但是整体1中还包含若干节点,所以继续分析整体1中的节点。
同理,从上往下分析,节点1左子树为一个整体(3、7、8),记为整体3;右子树为一个整体(4、9),记为整体4;所以此实,整体1中的先序遍历顺序为:
- 1 → 整体3 → 整体4
同理,整体3包含若干节点,需要继续分析整体3(3、7、8)。
此时我们发现节点3左子树只有一个节点7,右子树只有一个节点8,所以整体3的先序遍历顺序为:
- 3 → 7 → 8
于是,按照这个方法,我们能够推出整个二叉树的先序遍历顺序:
- 0 → 1 → 3 → 7 → 8 → 4 → 9 → 2 → 5 → 6
同理,我们能推导出另外两种深度优先遍历的遍历顺序:
- 先序遍历:0 → 1 → 3 → 7 → 8 → 4 → 9 → 2 → 5 → 6
- 中序遍历:7 → 3 → 8 → 1 → 9 → 4 → 0 → 5 → 2 → 6
- 后序遍历:7 → 8 → 3 → 9 → 4 → 1 → 5 → 6 → 2 → 0
1.2 深度优先遍历Python实现
根据上述的遍历过程描述,我们可以看出这实际上是一个递归的过程,因此使用递归可以很简单地实现3种深度优先遍历。
首先定义节点和树的类并定义添加节点的方法,之后在二叉树类中定义先序遍历、中序遍历和后序遍历的方法。
# 节点类
class Node(object):
def __init__(self, item):
self.elem = item
self.lchild = None
self.rchild = None
# 二叉树类
class Tree(object):
# 初始化方法
def __init__
力不竭!!!战不止!!!: 支持博主的创作,要是对服务器是CPU密集型和IO密集型有疑惑,可以看看这篇文章:http://t.csdn.cn/KJNLr
CSDN-Ada助手: 推荐 云原生入门 技能树:https://edu.csdn.net/skill/cloud_native?utm_source=AI_act_cloud_native
钊YChen: 谢谢大佬!
不正经的kimol君: 冲冲冲!!!