概念
广度优先搜索算法(英语:Breadth-First-Search,缩写为BFS),又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。广度优先搜索的实现一般采用open-closed表。(摘自-维基百科)
原题
559. Maximum Depth of N-ary Tree
Given a n-ary tree, find its maximum depth.
The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.
For example, given a 3-ary tree:
We should return its max depth, which is 3.
Note:
The depth of the tree is at most 1000.
The total number of nodes is at most 5000.
559. N叉树的最大深度
给定一个N叉树,寻找树的最大深度。
最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。
例如,3叉树 :
我们应该返回的最大深度为3。
注意:
树的深度在1000以内。
树的节点总数在5000以内。
- 本题在LeetCode上属于广度优先搜索算法分类下
原题提示-节点数据结构Node
class Node {
public int val;
public List<Node> children;
public Node() {
}
public Node(int _val, List<Node> _children) {
val = _val;
children = _children;
}
}
题意分析
根据题意,需要遍历最深的节点路径。因为不确定同一层上某个节点是否具备子节点,因此需要遍历每一层的所有节点,进而容易联想到典型的广度优先遍历思想。
思路设计
某个节点的最大深度,需要遍历所有当前节点的下一层子节点的深度,可以得出这一层子节点的最大深度,最后子节点的最大深度加上当前节点深度1即可得出某个节点最大深度。
伪代码:
1、判断根节点是否为空,为空直接返回深度0;
2、声明最大深度int型变量depth=0表示子所有子节点的最大深度的最大值;
3、循环遍历根节点的所有子节点,循环长度等于子节点个数,并且子节点列表不为空:
i.获取当前子节点的最大深度,递归调用,传入当前子节点作为新的根节点;
ii.若子节点的最大深度大于当前记录的最大深度depth,则更新depth为当前子节点深度,作为新的最大子节点深度
4、最终返回根节点的最大深度为所有子节点最大深度值+1;
编码实践
public int maxDepth(Node root) {
if (root == null) {
return 0;
}
int max_depth = 0;
for (int i = 0; i < root.children.size() && root.children != null; i++) {
int d = maxDepth(root.children.get(i));
if (d > max_depth) {
max_depth = d;
}
//depth = (d > depth ? d : depth);
}
return max_depth + 1;
}
彩蛋
上述题解编码中,可以看到有一句注释//depth = (d > depth ? d : depth); 使用了三目运算符替代if,本篇的彩蛋就是简单的if判断为什么没有使用三目运算而是使用的if,if一定比三目快吗?到底应该选择if还是选择三目呢?关于彩蛋,会在后续推文中揭晓答案,敬请期待!
结语
本篇题目相对简单,重点理解广度优先搜索算法思想和简单实践。关于广度优先算法,后续仍有进阶博客题解说明,同样敬请期待!如果觉得本文对你有所帮助或启发那就来个赞吧0.0~~