Skip to content

N 叉树的最大深度

约 860 字大约 3 分钟

2025-03-01

559. N 叉树的最大深度

给定一个 N 叉树,找到其最大深度。

最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:3

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:5

提示:

  • 树的深度不会超过 1000
  • 树的节点数目位于 [0, 104] 之间。

有返回值无信息参数的DFS,归并

递归计算每个子节点的深度,取最大值,返回+1

class Solution {
    public int maxDepth(Node root) {
        // 特殊条件:如果根节点为空,返回深度 0
        if (root == null) {
            return 0;
        }
        
        // 初始化最大子节点深度为 0
        int maxChildDepth = 0;
        
        // 获取当前节点的所有子节点
        List<Node> children = root.children;
        // 遍历所有子节点
        for (Node child : children) {
            // 递归计算每个子节点的深度
            int childDepth = maxDepth(child);
            // 更新最大子节点深度
            maxChildDepth = Math.max(maxChildDepth, childDepth);
        }
        
        // 当前节点的深度为最大子节点深度加 1
        return maxChildDepth + 1;
    }
}
  • 时间复杂度:O(n),其中 n 为 N 叉树节点的个数。每个节点在递归中只被遍历一次。
  • 空间复杂度:O(height),其中 height 表示 N 叉树的高度。递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于 N 叉树的高度。

层序遍历

取出节点后要入队子节点,然后当前层的节点数减一,减到0后深度加一。

class Solution {
    public int maxDepth(Node root) {
        // 如果根节点为空,返回深度 0
        if (root == null) {
            return 0;
        }
        
        // 使用队列进行广度优先搜索
        Queue<Node> queue = new LinkedList<Node>();
        // 将根节点加入队列
        queue.offer(root);
        // 初始化深度为 0
        int ans = 0;
        
        // 当队列不为空时继续遍历
        while (!queue.isEmpty()) {
            // 获取当前层的节点数
            int size = queue.size();
            // 遍历当前层的所有节点
            while (size > 0) {
                // 从队列中取出一个节点
                Node node = queue.poll();
                // 获取该节点的所有子节点
                List<Node> children = node.children;
                // 将子节点加入队列
                for (Node child : children) {
                    queue.offer(child);
                }
                // 当前层节点数减 1
                size--;
            }
            
            // 当前层遍历完,深度加 1
            ans++;
        }
        
        // 返回最大深度
        return ans;
    }
}
  • 时间复杂度:O(n),其中 n 为 N 叉树的节点个数。与方法一同样的分析,每个节点只会被访问一次。
  • 空间复杂度:此方法空间的消耗取决于队列存储的元素数量,其在最坏情况下会达到 O(n)。

回溯,无返回值无信息参数的DFS,全局变量。

class Solution {
    public int maxDepth(Node root) {
        traverse(root);
        return res;
    }

    // 记录递归遍历到的深度
    int depth = 0;
    // 记录最大的深度
    int res = 0;

    void traverse(Node root) {
        // 结束条件
        if (root == null) {
            return;
        }
        
        // 前序遍历位置
        depth++;
        res = Math.max(res, depth);
        for (Node child : root.children) {
            traverse(child);
        }
        // 后序遍历位置
        depth--;
    }
}
  • 每个节点都会被访问一次,因此时间复杂度是O(n),n是节点总数。
  • 空间复杂度就是递归栈的深度,即N叉树的高度H。