欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

LeetCode 104. 二叉树的最大深度 | Python

程序员文章站 2022-06-15 12:25:51
使用递归、广度优先搜索的思路,解决《LeetCode 104. 二叉树的最大深度》问题...

104. 二叉树的最大深度


题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/maximum-depth-of-binary-tree

题目


给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回它的最大深度 3 。

解题思路


思路:递归、广度优先搜索

题目中提示,【二叉树的深度为根节点到最远叶子节点的最长路径上的节点数】。那么在这里,我们考虑从递归和广度优先搜索的思路去解决此问题。下面先从递归的思路,对问题进行分析解决。

递归

根据题目的提示,我们知道,二叉树的深度是跟它的左右子树的深度有关。

前面说,二叉树的深度是根节点到最远叶子节点的最长路径上的节点数,那么也就说当我们得到左子树和右子树的最大深度时,只要取两者中较大深度的加上根节点的深度就是整个二叉树的深度。那么也就是说:二叉树的最大深度 = 左右子树最大深度较大的深度 + 根节点的高度。如下面的式子:

max_depth = max(left_tree_depth, right_tree_depth) + 1

那么现在的问题就是如何去左右子树的最大深度,在这里,两者的计算方式是相同的。我们可以递归去计算左右子树的最大深度,当遇到叶子节点时,退出递归。

具体的代码见【代码实现 # 递归】

广度优先搜索

这里,我们也可以使用广度优先搜索的思路来解决问题。在这里,我们需要添加一个辅助队列。我们将当前层的所有节点都存入这个辅助队列中。

在这里需要注意一点,当我们准备搜索下一层时,这里需要将队列中当前层的所有节点都进行出队,然后让这些节点往下层搜索。

那么,如果当前层的所有节点都出列,队列还非空,那么说明下一层还有节点。循环直至队列为空,定义变量 depth,每层搜索的时候维护更新该值,那么最终,depth 就是我们要求的二叉树最大深度。

具体的代码见【代码实现 # 广度优先搜索】

代码实现


# 递归
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        # 终止条件
        if not root:
            return 0

        # 递归计算左右子树的最大深度
        left_tree_depth = self.maxDepth(root.left)
        right_tree_depth = self.maxDepth(root.right)

        return max(left_tree_depth, right_tree_depth) + 1

# 广度优先搜索
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        # 处理特殊情况
        if not root:
            return 0

        from collections import deque
        # 辅助队列
        queue = deque()

        # 记录二叉树深度,维护更新,
        depth = 0

        queue.append(root)

        while queue:
            # 当前层所有节点出列,往下搜索
            size = len(queue)

            for i in range(size):
                node = queue.popleft()
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)

            depth += 1
        
        return depth

实现结果


实现结果 # 递归

LeetCode 104. 二叉树的最大深度 | Python

实现结果 # 广度优先搜索

LeetCode 104. 二叉树的最大深度 | Python

欢迎关注


公众号 【书所集录

本文地址:https://blog.csdn.net/weixin_45642918/article/details/107642583