leetcode每日一题:559. N 叉树的最大深度

159 阅读2分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

1.题目

2021年11月21日leetcode的每日一题题目跳转链接在此: 559. N 叉树的最大深度

题目如下:

给定一个 N 叉树,找到其最大深度
最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。
N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。

示例 1:

image.png

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

示例 2:

image.png

输入: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] 之间。

给出的多叉树数据结构为:

class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};

2. 解题

首先,题目要求N叉树的最大深度,这道题也很简单,我们可以将问题分解:我需要知道一个节点的最大深度,只需要递归计算出其每个子树的最大深度maxChildDepth,然后再+1就可以了,因此我们可以用深度搜索算法来解这道题:

解法一:深度优先搜索

public int maxDepth(Node root) {
        //递归返回条件,在叶子节的子节点时,当前深度为0,所以返回0;
        if (root == null) {
            return 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)
  • 空间复杂度:递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度为O(height)

解法二:广度优先搜索

public int maxDepth(Node root) {
    if (root == null) {
        return 0;
    }
    //保存当前层的所有节点
    Queue<Node> queue = new LinkedList<Node>();
    //第一层只有root
    queue.offer(root);
    //维护拓展的次数
    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);
            }
            size--;
        }
        //当前这一层全部节点都已经经历过,深度加1
        ans++;
    }
    return ans;
}
  • 时间复杂度:每个节点访问一次,复杂度为O(n)
  • 空间复杂度:此方法空间的消耗取决于队列存储的元素数量,在最坏情况空间复杂度为 O(n)

3. 总结

总的来说,树和图的算法经常会碰到DFS和BFS,大家应该熟练掌握这两种算法。