给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
例如,给定一个 3叉树
:
class Solution:
def levelOrder(self, root: 'Node') -> List[List[int]]:
if root == None:
return []
n_stack = [root]
res = []
while n_stack:
length = len(n_stack)
level_list = []
while length:
tmp = n_stack.pop(0)
level_list.append(tmp.val)
n_stack.extend(tmp.children)
length -= 1
res.append(level_list)
return res
在广度优先搜索的同时,将每一层的节点的值组成list
,最后放到一个总的list
里。
时间复杂度为 O ( N ) O \left( N \right) O(N)。空间上用了一个栈来实现迭代,不考虑只有根节点的极端情况,满T叉树时栈的最大深度为倒数第二层的节点数量+T - 1,倒数第二层节点数量为 T k − 2 T^{k-2} Tk−2(k为总层数),树的总节点数为 1 − T k 1 − T \frac{1-T^k}{1-T} 1−T1−Tk,两者相除,可以得出空间复杂度为 O ( N ) O \left( N\right) O(N)。
每次将首元素从列表里pop
出来可能会有较大的开销,因此可以考虑另外一种迭代方式。
class Solution(object):
def levelOrder(self, root):
if not root:return []
res = []
stack = [root]
while stack:
temp = []
next_stack = []
for node in stack:
temp.append(node.val)
for child in node.children:
next_stack.append(child)
stack = next_stack
res.append(temp)
return res
这里的思路是将每一层的节点放入另外一个列表里next_stack
,在该层所有节点都放进去之后,直接将next_stack
赋值给stack
,从而避免了pop
操作。
还有一种简洁版的,但是效率一般:
class Solution(object):
def levelOrder(self, root):
q, ret = [root], []
while any(q):
ret.append([node.val for node in q])
q = [child for node in q for child in node.children]
return ret
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务