Likou-103 Zigzag Sequence Traversal of Binary Tree

# 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

Refer to the official problem solution 103 , you can set up a double-ended queue, you can insert elements at any end of the queue, so that when traversing the binary tree, the effect of traversing from left to right and from right to left is achieved.

# 解法二:双端队列
# 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)

Guess you like

Origin blog.csdn.net/tailonh/article/details/112390688