python二叉树最大深度的计算_LeetCode 104. 二叉树的最大深度 | Python

本文介绍了如何计算二叉树的最大深度,提供了两种解题方法:递归和广度优先搜索。通过递归,利用左右子树最大深度的较大值加1得到整体深度;广度优先搜索则借助队列逐层遍历。代码实现包括两种方法,并给出了相应示例。
摘要由CSDN通过智能技术生成

104. 二叉树的最大深度

题目

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

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

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

示例:

给定二叉树 [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

实现结果

实现结果 # 递归

实现结果 # 广度优先搜索

欢迎关注

公众号 【书所集录】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值