LeetCode104: 二叉树的最大深度

题目来源:二叉树的最大深度
题目:给定一个二叉树,找出其最大深度。

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

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

示例:

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

返回它的最大深度 3 。

解题思路
递归、广度优先搜索

题目中提示,“二叉树的深度为根节点到最远叶子节点的最长路径上的节点数”。我们考虑从递归和广度优先搜索的思路去解决此问题。

递归

时间复杂度:O(N),空间复杂度:O(height):递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于二叉树的高度。

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

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

max_depth = max(left_depth, right_depth) + 1

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

终止条件:当前节点为空
返回值:节点为空时说明高度为 0,所以返回 0;节点不为空时则分别求左右子树的高度的最大值,同时加1表示当前节点的高度,返回该数值

    def maxDepth(self, root: TreeNode) -> int:
        if not root: return 0
        left_depth = self.maxDepth(root.left)
        right_depth = self.maxDepth(root.right)

        return max(left_depth, right_depth) + 1

广度优先搜索:队列

时间复杂度:O(N),空间复杂度:O(N)

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

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

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

    def maxDepth(self, root: TreeNode) -> int:
        if not root: return 0
        from collections import deque
        queue = deque()
        # 记录二叉树深度,维护更新
        depth = 0
        queue.append(root)

        while queue:
            # 当前层所有节点出列,往下搜索
            for _ in range(len(queue)):
                node = queue.popleft()
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            depth += 1

        return depth

    def maxDepth3(self, root: TreeNode) -> int:
        if not root: return 0
        from collections import deque
        depth = 0
        queue = deque([root])

        while queue:
            depth += 1
            # 保存下一层所有节点
            next_layer = []
            while queue:
                node = queue.popleft()
                if node.left:
                    next_layer.append(node.left)
                if node.right:
                    next_layer.append(node.right)
            queue = deque(next_layer)

        
    def maxDepth4(self, root: TreeNode) -> int:
        from collections import deque
        queue = deque([root])
        level = 0
        while queue:
            for _ in range(len(queue)):
                node = queue.popleft()
                if node:    # is not None
                    queue.extend([node.left, node.right])
            level += 1
        return level - 1

广度优先搜索:队列

    def maxDepth5(self, root: TreeNode) -> int:
        if not root: return 0
        stack = [(1, root)]
        depth = 0
        # 将(1,root)加入栈后不断遍历栈
        while stack:
            # 首先从栈中弹出元素
            cur_depth, node = stack.pop()
            # 如果弹出的节点不为空
            if node:
                # 比较这个节点的深度和depth的大小
                depth = max(cur_depth, depth)
                # 将 (当前深度+1,left)放入栈中
                stack.append((cur_depth + 1, node.left))
                # 同理将(当前深度+1,right)放入栈中
                stack.append(cur_depth + 1, node.right)
        return depth

你可能感兴趣的:(LeetCode104: 二叉树的最大深度)