LeetCode N叉树的层序遍历

题目

  给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。

示例

  例如,给定一个 3叉树 :

解法


一、广度优先搜索( Python )
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} Tk2(k为总层数),树的总节点数为 1 − T k 1 − T \frac{1-T^k}{1-T} 1T1Tk,两者相除,可以得出空间复杂度为 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值