对于广度优先搜索算法的一个经典应用问题,也就是对二叉树求其最大深度、最小深度问题。对于给定的二叉树的最大深度即为二叉树的根节点到最远的叶子结点之间的高度,而相应的最小深度就是根节点与离根节点最近的叶子节点之间的高度。
添加图片注释,不超过 140 字(可选)
上面这颗树的最大深度为3,最小深度为2,也就是根节点1到5节点的高度和根节点1到2节点的高度。
首先就是对二叉树的最大深度的问题解决思路分析,在借助队列的结构来完成,对二叉树进行逐层搜索,使用一个变量来累计深度,这样就可以返回最大深度了。主要使用双层循环迭代的方式,在进入迭代的过程中,只要队列不为空的情况下,就继续访问目前队列职工的所有节点,先访问呢1节点,然后将1节点的子节点2和3咱是存在一个列表黄总工,然后在访问完当前的队列中的全部节点之后,就将暂时的列表合并进入到队列中,并且最大深度变量自增,经过这次循环之后,队列中就有了2和3节点,再通过第二层循环访问这两个节点,并且将节点2和3暂存到列表中,节点2没有子节点,节点3有4和5节点,对列表和最大深度变量进行更新,最后就是4和5节点,访问这两个节点之后就对最大深度变量更新,就会得到返回值最大深度为3。整个过程中使用的双层循环进行逐层访问,第一层访问的目的是为了检测队列是否为空的状态,如果不为空就继续循环,第二层循环的目的是访问目前的队列中的全部的节点,也就是这一层中的所有的节点,然后访问之后就对最大深度变量进行自增,就可以得到最后想要的结果。下图为图示过程:
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
最大深度的python实现代码如下:
from collections import deque
def maxDepth( root):
if not root:
return 0
ans=0
queue=deque([root])
while queue:
tmp=[]
while queue:
node=queue.popleft()
if node.left:
tmp.append(node.left)
if node.right:
tmp.append(node.right)
queue.extend(tmp)
ans+=1
return ans
对应的最小深度的过程会相对简单一些,在对二叉树进行从上至下的访问的过程中,只要访问到的是叶节点,并且证明这个叶节点到根节点是最近的叶节点,也就可以得到了该二叉树的最小深度,同样是使用队列来进行实现,如果当前节点是叶节点,返回该节点的深度为最终的结果,如果当前节点不满足判断且不是空节点,就存在子节点,将子节点继续入队。对应的python的代码实现如下:
from collections import deque
def minDepth(root):
if not root:return 0
queue=deque([(1,root)])
while(queue):
depth,node=queue.popleft()
if node and not node.left and not node.right:
return depth
if node:
queue.append((depth+1,node.left))
queue.append((depth+1,node.right))