Leetcode 107:二叉树的层次遍历 II(最详细解决方案!!!)

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其自底向上的层次遍历为:

[
  [15,7],
  [9,20],
  [3]
]

解题思路

参考这篇文章Leetcode 102:二叉树的层次遍历(最详细解决方案!!!)

我们仅需要将tmp list不断插入result的最前面就可以了。或者我们可以将结果进行reverse同样可以。

class Solution:
    def levelOrderBottom(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        q, result = [root], []
        while any(q):
            tmp = list()
            len_q = len(q)
            for _ in range(len_q):
                node = q.pop(0)
                tmp.append(node.val)
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)

            result.insert(0, tmp)
        return result

另外这个问题还有一种是用递归的写法。

class Solution:
    def _levelOrderBottom(self, level, result, node):
        if node:
            if level > len(result):
                result.insert(0,[])

            result[-level].append(node.val)
            self._levelOrderBottom(level+1, result, node.left)
            self._levelOrderBottom(level+1, result, node.right)

    def levelOrderBottom(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        level, result = 1, list()        
        self._levelOrderBottom(level, result, root)
        return result  

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值