Binary Tree Level Order Traversal

leetcode第102题,按层输出二叉树,这道题看上去简单,但是确实需要一定技巧。

首先,既然是按层输出,当然首先想到广搜,但是广搜有一个很大的问题需要解决,那就是如何标记节点属于哪一个层,如果节点的定义可以加入层数属性即可解决,但是树的节点定义不能改变,所以只能想另外的办法。

我参考的方法是这样,首先正常的进行广搜,不断地把左右结点加入搜索对列,在加入的同时会有一个一开始初始化为1的计数器,当到第二层的时候,计数器自减归零,此时判断计数器是否为零,如果是说明第一层已经结束了,结果加入第二层节点的值,同时把计数器记录当前搜索队列的元素个数。当继续向下广搜的时候,随着原来第二层的两个节点陆续出队,计数器再次归零,此时搜索队列中只有第三次的元素了,以此类推即可求解。

最后注意需要检查一下对列是否为空,否则会加入一个空列表。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None


class Solution(object):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if root == None:
            return []
        queue = [root]
        ans = [[root.val]]
        count = 1
        while len(queue) > 0:
            curNode = queue[0]
            del queue[0]
            if curNode.left != None:
                queue.append(curNode.left)
            if curNode.right != None:
                queue.append(curNode.right)
            count -= 1
            if count == 0 and len(queue) != 0:
                ans.append([x.val for x in queue])
                count = len(queue)
        return ans


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值