力扣-103 二叉树的锯齿形层序遍历

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
# 解法一:前序遍历,记录每层从左到右的节点,然后进行翻转
class Solution:
    def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
        if root == None:
            return []
        res = {
    
    }
        level = 1
        def PreOrder(root, level):
            if level not in res:
                res[level]=[root.val]
            else:
                res[level].append(root.val)
            if root.left:
                PreOrder(root.left, level+1)
            if root.right:
                PreOrder(root.right, level+1)
        PreOrder(root, 1)
        n = []
        for k,v in res.items():
            n_ = []
            if k%2 ==0:
                n.append(v[::-1])
            else:
                n.append(v)
        return n

参考官方题解103,可以设置一个双端队列,可以在队列任意一端插入元素,从而在遍历二叉树时,达到从左到右和从右到左遍历的效果。

# 解法二:双端队列
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
        if root == None:
            return []
        bi_queue = [root]
        res = []
        level = 1
        while bi_queue:
            q_len = len(bi_queue)
            cur_list = []
            for i in range(q_len):
                if level % 2 != 0: #奇数层
                    cur = bi_queue.pop(-1)
                    cur_list.append(cur.val)
                    if (level+1) % 2 == 0:  #偶数层
                        if cur.left:
                            bi_queue.insert(0,cur.left)
                        if cur.right:
                            bi_queue.insert(0,cur.right)
                    else:  					#奇数层
                        if cur.right:
                            bi_queue.append(cur.right)
                        if cur.left:
                            bi_queue.append(cur.left)
                else:             #偶数层
                    cur = bi_queue.pop(0)
                    cur_list.append(cur.val)
                    if (level+1) % 2 == 0:  #偶数层
                        if cur.left:
                            bi_queue.insert(0,cur.left)
                        if cur.right:
                            bi_queue.insert(0,cur.right)
                    else:  					#奇数层
                        if cur.right:
                            bi_queue.append(cur.right)
                        if cur.left:
                            bi_queue.append(cur.left)

            res.append(cur_list)
            level += 1
        return res
        # print(res)

猜你喜欢

转载自blog.csdn.net/tailonh/article/details/112390688