publicclassSolution { publicintMaxDepth(Node root) { if (root == null) { return0; } int maxChildDepth = 0; IList<Node> children = root.children; foreach (Node child in children) { int childDepth = MaxDepth(child); maxChildDepth = Math.Max(maxChildDepth, childDepth); } return maxChildDepth + 1; } }
[sol1-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution { public: intmaxDepth(Node* root){ if (root == nullptr) { return0; } int maxChildDepth = 0; vector<Node *> children = root->children; for (auto child : children) { int childDepth = maxDepth(child); maxChildDepth = max(maxChildDepth, childDepth); } return maxChildDepth + 1; } };
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12
var maxDepth = function(root) { if (!root) { return0; } let maxChildDepth = 0; const children = root.children; for (const child of children) { const childDepth = maxDepth(child); maxChildDepth = Math.max(maxChildDepth, childDepth); } return maxChildDepth + 1; };
[sol1-Golang]
1 2 3 4 5 6 7 8 9 10 11 12
funcmaxDepth(root *Node)int { if root == nil { return0 } maxChildDepth := 0 for _, child := range root.Children { if childDepth := maxDepth(child); childDepth > maxChildDepth { maxChildDepth = childDepth } } return maxChildDepth + 1 }
[sol1-Python3]
1 2 3
classSolution: defmaxDepth(self, root: 'Node') -> int: returnmax((self.maxDepth(child) for child in root.children), default=0) + 1if root else0
复杂度分析
时间复杂度:O(n),其中 n 为 N 叉树节点的个数。每个节点在递归中只被遍历一次。
空间复杂度:O(\textit{height}),其中 height 表示 N 叉树的高度。递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于 N 叉树的高度。
方法二:广度优先搜索
我们也可以用「广度优先搜索」的方法来解决这道题目,但我们需要对其进行一些修改,此时我们广度优先搜索的队列里存放的是「当前层的所有节点」。每次拓展下一层的时候,不同于广度优先搜索的每次只从队列里拿出一个节点,我们需要将队列里的所有节点都拿出来进行拓展,这样能保证每次拓展完的时候队列里存放的是当前层的所有节点,即我们是一层一层地进行拓展。最后我们用一个变量 ans 来维护拓展的次数,该 N 叉树的最大深度即为 ans。
classSolution: defmaxDepth(self, root: 'Node') -> int: if root isNone: return0 ans = 0 queue = [root] while queue: queue = [child for node in queue for child in node.children] ans += 1 return ans
复杂度分析
时间复杂度:O(n),其中 n 为 N 叉树的节点个数。与方法一同样的分析,每个节点只会被访问一次。