2022跟着leedcode学数据结构--第19天

117 阅读1分钟

「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战

image.png

[从前序与中序遍历序列构造二叉树]

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

 

示例 1:

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] 输出: [3,9,20,null,null,15,7] 示例 2:

输入: preorder = [-1], inorder = [-1] 输出: [-1]  

提示:

1 <= preorder.length <= 3000 inorder.length == preorder.length -3000 <= preorder[i], inorder[i] <= 3000 preorder 和 inorder 均 无重复 元素 inorder 均出现在 preorder preorder 保证 为二叉树的前序遍历序列 inorder 保证 为二叉树的中序遍历序列

解析思路: - 递归遍历

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        def help_build(x,y):
            if not x:
                return
            if len(x)==1:
                return TreeNode(x[0])
            root=TreeNode(x[0])
            t=y.index(x[0])
            root.left=help_build(x[1:t+1],y[:t])
            root.right=help_build(x[t+1:],y[t+1:])
            return root
        return help_build(preorder,inorder)


执行结果:

image.png

[二叉树的锯齿形层序遍历]

给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

示例 1:

image.png

输入:root = [3,9,20,null,null,15,7] 输出:[[3],[20,9],[15,7]] 示例 2:

输入:root = [1] 输出:[[1]] 示例 3:

输入:root = [] 输出:[]

提示:

树中节点数目在范围 [0, 2000] 内 -100 <= Node.val <= 100

解题思路:

- 先判断是否为空,为空返回[]
- 通过bfs方法,进行判断,使用辅助is_even_level参数去判断奇偶行,然后进行存储
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []                
        
        ans = []
        self.bfs(root,ans)
        return ans

    def bfs(self,root,ans):
        is_even_level = True
        queue = [root]
        while queue:
            level_queue = deque()
            size = len(queue)
            
            for _ in range(size):
                node = queue.pop()
                if is_even_level:
                    level_queue.append(node.val)
                else:
                    level_queue.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            ans.append(list(level_queue))
            is_even_level = not is_even_level

执行结果:

image.png