广度优先搜索算法(英语:Breadth-First-Search,缩写为BFS),又译做宽度优先搜索,或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。若是全部节点均被访问,则算法停止。广度优先搜索的实现通常采用open-closed表。(摘自-维基百科)node
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.bash
For example, given a 3-ary tree: 数据结构
Note:ui
The depth of the tree is at most 1000.编码
The total number of nodes is at most 5000.spa
给定一个N叉树,寻找树的最大深度。设计
最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。code
例如,3叉树 : cdn
注意:
树的深度在1000之内。
树的节点总数在5000之内。
class Node {
public int val;
public List<Node> children;
public Node() {
}
public Node(int _val, List<Node> _children) {
val = _val;
children = _children;
}
}
复制代码
根据题意,须要遍历最深的节点路径。由于不肯定同一层上某个节点是否具有子节点,所以须要遍历每一层的全部节点,进而容易联想到典型的广度优先遍历思想。
某个节点的最大深度,须要遍历全部当前节点的下一层子节点的深度,能够得出这一层子节点的最大深度,最后子节点的最大深度加上当前节点深度1便可得出某个节点最大深度。
一、判断根节点是否为空,为空直接返回深度0;
二、声明最大深度int型变量depth=0表示子全部子节点的最大深度的最大值;
三、循环遍历根节点的全部子节点,循环长度等于子节点个数,而且子节点列表不为空:
i.获取当前子节点的最大深度,递归调用,传入当前子节点做为新的根节点;
ii.若子节点的最大深度大于当前记录的最大深度depth,则更新depth为当前子节点深度,做为新的最大子节点深度
四、最终返回根节点的最大深度为全部子节点最大深度值+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~~