二叉树的最大深度——递归算法与非递归算法实现及其复杂度分析

题目来源于力扣,如下:
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7]
二叉树的最大深度——递归算法与非递归算法实现及其复杂度分析_第1张图片
返回它的最大深度 3 。

  • 算法一:递归方式求解

对于一个具有n个节点的二叉树,需要调用函数2n+1次访问其扩充二叉树全部结点,尾递归方式开辟临时空间n个用于变量存储,时间复杂度O(n)空间复杂度O(n)

def maxDepth2(root: TreeNode) -> int:
    return 0 if root == None else max([maxDepth2(root.left), maxDepth2(root.right)]) + 1
  • 算法二:非递归方式

利用宽度优先搜索方式,创建两个队列分别用于存储当前层和下一层结点,对n个结点需遍历n次,循环内各操作时间复杂度均为O(1),故总体时间复杂度为O(n);两队列最多需要存储n/2个结点数据,空间复杂度O(n)

def maxDepth(root: TreeNode) -> int:
    if root is None: return 0
    depth = 1
    q1, q2 = [], []  # 先进先出队列
    q1.append(root)
    while q1 != [] or q2 != []:
        if q1 == []:
            depth +=1
            q1, q2 = q2, q1
        root = q1.pop(0)
        if root.left is not None:  # 将非空的左右子树存入队列
            q2.append(root.left)
        if root.right is not None:
            q2.append(root.right)
    return depth

你可能感兴趣的:(数据结构与算法,二叉树,递归与迭代,宽度优先)