题目描述

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

输入示例

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

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

   3
  / \
 9  20
   /  \
  15   7

返回它的最大深度3

树的定义

首先,给出我们将要使用的树的节点TreeNode的定义:

/**
* Definition for a binary tree node. 
*/
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

方法一:递归

算法描述

DFS 递归求解
DFS 递归求解

最直观的方法是通过递归来解决该问题,上图演示了 DFS(深度优先搜索)策略的求解过程。

Java 实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
  public int maxDepth(TreeNode root) {
      return root == null ? 0 : Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
  }
}

复杂度分析

  • 时间复杂度:由于每个结点只访问一次,因此时间复杂度为 $O(N)$,其中N是节点的数量。
  • 空间复杂度:在最糟糕的情况下,树是完全不平衡的。例如每个节点只剩下左子节点,这时递归将会被调用N次(树的高度),因此保持调用栈的存储为 $O(N)$。但在最好的情况下(树是完全平衡的),树的高度为 $\log(N)$,此时空间复杂度为 $O(\log(N))$。

方法二:迭代

算法描述

迭代的思路是使用 DFS 策略访问每个节点,同时在每次访问时更新最大深度

所以从包含根节点且相应深度为1的栈开始,然后继续迭代:将当前节点弹出栈并推入子节点。并且每一步都会更新深度

Java 实现

import java.util.LinkedList;
import java.util.Queue;
import javafx.util.Pair;

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
  public int maxDepth(TreeNode root) {
    Queue<Pair<TreeNode, Integer>> stack = new LinkedList<>();
      if (root != null) {
          stack.add(new Pair(root, 1));
      }

      int depth = 0;
      while (!stack.isEmpty()) {
          Pair<TreeNode, Integer> current = stack.poll();
          root = current.getKey();
          int current_depth = current.getValue();
          if (root != null) {
              depth = Math.max(depth, current_depth);
              stack.add(new Pair(root.left, current_depth + 1));
              stack.add(new Pair(root.right, current_depth + 1));
          }
      }
    return depth;
  }
}

复杂度分析

  • 时间复杂度:$O(N)$
  • 空间复杂度:$O(N)$

参考文章

  1. 104. Maximum Depth of Binary Tree | Leetcode
  2. Leetcode 104. 二叉树的最大深度 | 苏易北
  3. 题解 - 104. 二叉树的最大深度 | Leetcode力扣