leetcode专题训练 103. Binary Tree Zigzag Level Order Traversal

这道题我最开始的思路是直接将树用层序遍历输出,得到没有zigzag过的层序遍历结果,然后再对这个结果进行处理,将从右向左的行,通过python的逆向切片操作[::-1]来得到最后的结果。不过后来想了一下,在层序遍历时,就可以知道哪一行是向左,哪一行是向右,所以直接在层序遍历时处理即可。
最终思路:
首先是层序遍历。定义两个队列,一个是queue一个是nextqueue,因为需要区分不同的层,所以需要定义两个队列。这里需要注意的是区分不同层的方法。将当前层存储在queue中,下一层存储在nextqueue中,遍历queue中的节点的时候,将该节点的left和right子节点保存在nextqueue中,如果当前层遍历完成,那么就将nextqueue赋值到queue,将nextqueue置空。
在区分了不同层之后,就可以在每次切换层的时候,对方向指示变量dir进行改变。如果dir==1,那么就说明是向右,直接将本行的结果layerresult加入result,同时将dir置为-1即可,如果dir不是1,那么就说明是向左,将本行的结果逆向切片后,将layerresult[::-1]加入result,同时将dir置为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 solve(self, root):
        result = []
        result.append([root.val])
        queue = []
        nextqueue = []
        if root.left is not None:
            queue.append(root.left)
        if root.right is not None:
            queue.append(root.right)
        dir = -1
        while len(queue) != 0:
            layerresult =[]
            for node in queue:
                # print(node.val)
                layerresult.append(node.val)
                if node.left is not None:
                    nextqueue.append(node.left)
                if node.right is not None:
                    nextqueue.append(node.right)
            if dir == 1:
                dir = -1
                result.append(layerresult)
            else:
                dir = 1
                result.append(layerresult[::-1])
            queue = nextqueue
            nextqueue = []
        return result

    def zigzagLevelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if root is None:
            return []

        return self.solve(root)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值