Leetcode Link: 104. 二叉树的最大深度 - 力扣(LeetCode) (leetcode-cn.com) 剑指 Offer 55 - I. 二叉树的深度 - 力扣(LeetCode)
题目
给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。

注意:root=None的其深度为0
解法一
思路:利用DFS(考虑二叉树的层次遍历),设置指示层深的参数,每次都取当前层深和最大深度的max 题解:这个思路也是我想的
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
self.depth = 1
self.recur(1, root)
return self.depth
def recur(self, index, cur):
if cur == None:
return
self.depth = max(index, self.depth)
self.recur(index+1, cur.left)
self.recur(index+1, cur.right) 缺点,不够优雅,优雅的是解法二
解法二
思路:递归(也属于DFS?)。分解成小规模的问题,小规模的问题等价于:计算当前节点的左右子树深度,当前子树的深度为左右子树深度中最大的那个。也就是说递归函数返回的是当前子树的深度(当前子树作为其父节点的左或者右子树,就这么一点一点向上送)
同样也需要知道当前节点所有子树的信息之后进行操作
题解:
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
leftDepth = self.maxDepth(root.left)
rightDepth = self.maxDepth(root.right)
return max(leftDepth, rightDepth) + 1解法三
思路:BFS的思路,直接设置一个指示深度的变量一点一点累加就行了
BFS用队列
题解:
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
'''BFS,用队列'''
if not root:
return 0
q = collections.deque()
q.append(root)
# 设置深度
depth = 0
while(q):
N = len(q)
depth += 1 # 注意在哪里depth++
for _ in range(N):
cur = q.popleft()
if cur.left: q.append(cur.left)
if cur.right: q.append(cur.right)
return depth