二叉树广度和深度遍历的全部算法
对于二叉树的遍历,有广度遍历和深度遍历两大类,对于深度遍历又分为先序、中序和后序,这三种先中后序又可以用递归和非递归两种算法来写,下面就分别对这两大类算法做个总结,以后遇到此种问题可以用下面模板来写。
二叉树广度优先遍历
广度优先遍历又叫层次遍历,即对二叉树从上到下,从左到右,一层一层的来遍历。
算法大致流程如下:
- 建立一个空队列用来存放要遍历的节点,初始时先把函数的参数(一般为根节点)加入队列中
- 当队列不为空时,进入循环
- 取出队列头部节点,并对所取节点进行相关处理操作
- 判断如果节点左子节点不为空,则将左子节点加入队列
- 判断如果节点右子节点不为空,则将右子节点加入队列
- 退出循环,若需要返回参数则返回参数
注意:若需要利用层数,则在进入循环时先求队列长度(每层的节点数),然后将上面循环内的操作放入一个for 循环中执行,for循环用每层节点数来控制
举个🌰 :104.二叉树的最大深度
在此题中,求二叉树的深度,即为求二叉树的层数,我们可以用广度遍历算法来求,每到一层,就将深度加1,流程在上面我已经说明,接下来看代码,以后遇到此种类型题,都可以将下面代码作为模板。
class Solution(object):
def maxDepth(self, root):
"""
:type root: TreeNode
:rtype: int
"""
"""广度优先遍历"""
if root is None:
return 0
depth = 0
queue = collections.deque() # 创建空队列存放要遍历的节点
queue.append(root) # 初始将函数的参数(一般为根节点)加入队列
# 当队列不为空时进入循环
while queue:
# 求每层的节点数
size = len(queue)
# 每到一层,深度加1
depth += 1
# 用每层的节点数控制一个for循环
for i in range(size):
# 取出队列头部节点
node = queue.pop()
# 判断节点左子节点
if node.left:
queue.append(node.left