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

启发和联系