Likou-103 Recorrido de secuencia en zigzag del árbol binario

# 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

Consulte la solución oficial del problema 103 , puede configurar una cola de dos extremos, puede insertar elementos en cualquier extremo de la cola, de modo que al atravesar el árbol binario, el efecto de atravesar de izquierda a derecha y de derecha a izquierda se consigue.

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

Supongo que te gusta

Origin blog.csdn.net/tailonh/article/details/112390688
Recomendado
Clasificación