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
实现后果
实现后果 # 递归
实现后果 # 广度优先搜寻
欢送关注
公众号【书所集录】