N叉树的层序遍历的思路探讨与源码
N叉树的层序遍历的题目如下图,该题属于树类和搜索类型的题目,主要考察对于搜索方法的使用和树结构的理解。本文的题目作者想到2种方法,分别是BFS广度优先搜索方法和DFS深度优先搜索方法,其中BFS广度优先搜索方法使用Java进行编写,而DFS深度优先搜索方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
本人认为该题目可以使用BFS广度优先搜索方法的思路进行解决,首先判断树是否为空,如果是就直接返回空的列表结果。初始一个队列,并把树加入到队列里,再初始化一个列表。然后开始循环遍历队列,计算队列的长度,初始化一个层级列表,遍历每一个树的节点,把节点加入到层级列表里,然后遍历当前节点的子节点,把元素加入到队列里面,按照这个逻辑进行遍历直到循环结束并把所有的层级队列加入到结果列表里,最后返回结果列表。那么按照这个思路我们的Java代码如下:
#喷火龙与水箭龟
class Solution {
public List<List<Integer>> levelOrder(Node root) {
if (root == null) {
return new ArrayList<List<Integer>>();
}
Queue<Node> queue = new ArrayDeque<Node>();
queue.offer(root);
List<List<Integer>> res = new ArrayList<List<Integer>>();
while (!queue.isEmpty()) {
int countNum = queue.size();
List<Integer> level = new ArrayList<Integer>();
for (int ir = 0; ir < countNum; ir++) {
Node ind = queue.poll();
level.add(ind.val);
for (Node child : ind.children) {
queue.offer(child);
}
}
res.add(level);
}
return res;
}
}
显然,我们的BFS广度优先搜索方法的效果不错,还可以用DFS深度优先搜索方法进行解决。首先判断树是否为空,如果是空则直接返回空列表,再判断是否有子节点,如果是就直接返回树的根节点元素。初始化一个列表,然后开始遍历循环,进行合并叶子结点的层序遍历操作,再把结果加入到列表中,当遍历结束后把根节点加入到列表后并返回结果。所以按照这个思路就可以解决,下面是Python代码:
#喷火龙与水箭龟
class Solution:
def levelOrder(self, root: 'Node') -> List[List[int]]:
if not root:
return []
if not root.children:
return [[root.val]]
ind = []
for child in root.children:
nextNode = self.levelOrder(child)
idx = 0
while idx < len(ind) and idx < len(nextNode):
ind[idx] = ind[idx] + nextNode[idx]
idx = idx + 1
ind = ind + nextNode[idx:]
res = [[root.val]] + ind
return res
从结果来说Java版本的BFS广度优先搜索方法的效率不错,而Python版本的DFS深度优先搜索方法的速度也比较不错,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。